#344.reverse-string
题目链接:https://leetcode-cn.com/problems/reverse-string/
参考链接:https://leetcode-cn.com/problems/reverse-string/solution/fan-zhuan-zi-fu-chuan-by-leetcode/
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
- jsAPI可以直接反转数组
/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var reverseString = function(s) {
s.reverse()
};
- 通过遍历有两种解法,一种是单指针,一种是双指针
- 单指针是从头开始,只交换前 (n - 1) / 2 个元素就可,例如共5个元素,就交换前2个,即0, 1即可;共6个元素的话就交换前2.5个,即0,1,2
- 双指针是一个指向结束,一个指向开始,不断收缩,直到开始大于结束,就停止
- 交换元素的方法这里提供两种,一种是利用中间量交换,另外一种是js中的数组解构
/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var reverseString = function(s) {
var middle = (s.length - 1) / 2;
for(let i = 0; i < middle; i++){
let tmp = s[i];
s[i] = s[s.length - 1 - i];
s[s.length - 1 - i] = tmp;
}
};
/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var reverseString = function(s) {
for( var start = 0, end = s.length - 1; start < end; start++, end--){
[s[start], s[end]] = [s[end], s[start]]
}
};
- 递归调用然后交换元素
- 交换元素方法有很多,这里是将字符串转换为索引,然后异或
/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var changetwo = (a, b, s) => {
let aCode = s[a].charCodeAt(0);
let bCode = s[b].charCodeAt(0);
aCode = aCode^bCode;
bCode = aCode^bCode;
aCode = aCode^bCode;
s[a] = String.fromCharCode(aCode)
s[b] = String.fromCharCode(bCode)
}
var reverseString = function(s) {
var helper = (left, right) => {
if(left < right){
changetwo(left, right, s)
helper(left+1, right-1)
}
return
}
changetwo(0, s.length - 1, s)
};
- 思路较多较简单,主要是交换方法和指针遍历的结合,用jsAPI只能说是一种取巧的行为
- 虽然是字符串,但考验的还是数组