1.反转字符串 leetcode344
解题思路
对于字符串,我们定义两个指针(也可以说是索引下标)
一个从字符串前面,
一个从字符串后面,
两个指针同时向中间移动,交换元素
function reverseString(s) {
let left = 0;
let right = s.length - 1;
let temp = '';
while (left < right) {
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
2.反转字符串II leetcode541
注意点:这个反转字符串有特殊的规则,题目的意思是每隔k个 反转一次,再相隔k个,不反转,以此类推
var reverseStr = function (s, k) {
let result = '';
// 第一次可以反转
let isReverse = true
for (let i = 0; i < s.length; i += k) {
// 截取每次需要的字符串看是否旋转
let str = s.slice(i, i + k)
result += isReverse ? str.split('').reverse().join('') : str
// 一次反转一次不反转,以此类推
isReverse = !isReverse
}
}
3.翻转字符串里的单词 leetcode151
解题思路
1.先去掉多余的空格,保留每个字母之前的空格(双指针)
2.全部反转整个字符串
3.逐次反转每个空格前后的单词
注意:先整体反转在局部反转
var reverseWords = function (s) {
// 去除多余空格
let arr = s.split('');
let slow = 0;
let fast = 0;
while (fast < arr.length) {
// 如果第一个字符是空格,则去除掉,或者当前是空格且前一个是空格,则去掉连续多余的空格
if (arr[fast] === ' ' && (fast === 0 || arr[fast - 1] === ' ')) {
fast++
} else {
arr[slow] = arr[fast];
slow++;
fast++
}
}
// 移除末尾空格
arr.length = arr[slow - 1] === ' ' ? slow - 1 : slow;
// 反转全部单词
arr.reverse();
// 在逐次反转每个空格前后的单词
let start = 0;
for (let i = 0; i <= arr.length; i++) {
// 每次空格前,需要反转一次。到最后没有空格了,end就到最后一个字符
if (arr[i] === ' ' || i === arr.length) {
reverseStr(arr, start, i - 1);
// 下一个反转的起始点在空格之后
start = i + 1;
}
}
return arr.join('');
};
var reverseStr = function (arr, start, end) {
while (start < end) {
[arr[start], arr[end]] = [arr[end], arr[start]];
start++;
end--
}
}
4.剑指Offer58-II.左旋转字符串
// 先全部旋转,在旋转前length-n个,在旋转后面的length-n到length-1
先整体,在局部
// 先全部旋转,在旋转前length-n个,在旋转后面的length-n到length-1
// gfedcba=》cdefgba=》cdefgab
var reverseLeftWords = function (s, n) {
function reverseWords(strArr, start, end) {
let temp;
while (start < end) {
strArr[strArr[start], start[end]] = strArr[strArr[end], start[start]]
start++;
end--;
}
}
let strArr = s.split('');
let length = strArr.length;
reverseWords(strArr, 0, length - 1);
reverseWords(strArr, 0, length - n - 1);
reverseWords(strArr, length - n, length - 1);
return strArr.join('');
};
解法二
拼接两个字符串,截取符合要求的部分
// 拼接两个字符串,截取符合要求的部分
function reverseLeftWords(s, n) {
return (s+s).slice(n,s.length+n);
};