掘金团队号上线,助你 Offer 临门! 点击 查看详情
一、题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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"]
链接:leetcode-cn.com/problems/re…
二、思路分析:
从左右最两端开始交换位置,一直到中间位置结束为止。i>=len/2当s数组里的长度是奇数时,例如s = [1,2,3,4,5] ,只会交换1/5,2/4,3保持不变;当s长度是偶数时,例如s = [1,2,3,4,] ,会交换1/4,2/3
三、AC 代码:
var reverseString = function(s) {
let len = s.length
for(let i = len-1;i>=len/2;i--){
let temp = s[i]
s[i] = s[len-1-i]
s[len-1-i] = temp
}
};
四、总结:
官方思路:双指针
对于长度为 N 的待被反转的字符数组,我们可以观察反转前后下标的变化,假设反转前字符数组为 s[0] s[1] s[2] ... s[N - 1],那么反转后字符数组为 s[N - 1] s[N - 2] ... s[0]。比较反转前后下标变化很容易得出 s[i] 的字符与 s[N - 1 - i] 的字符发生了交换的规律,因此我们可以得出如下双指针的解法:
将 left 指向字符数组首元素,right 指向字符数组尾元素。 当 left < right:
- 交换 s[left] 和 s[right];
- left 指针右移一位,即 left = left + 1;
- right 指针左移一位,即 right = right - 1。 当 left >= right,反转结束,返回字符数组即可。
代码:
var reverseString = function(s) {
const n = s.length;
for (let left = 0, right = n - 1; left < right; ++left, --right) {
[s[left], s[right]] = [s[right], s[left]];
}
};
本文正在参与掘金团队号上线活动,点击 查看大厂春招职位