反转字符串
本题使用双指针即可实现:一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。过程如下:

代码如下:
var reverseString = function(s) {
for (let i = 0, j = s.length - 1; i < j; i++, j--) {
const temp = s[i];
s[i] = s[j];
s[j] = temp;
};
return s;
};
反转字符串II
本题的关键是确定循环的间隔:每个2k个字符循环一次。然后对当前子字符串的后k个做反转处理。
代码如下:
var reverseStr = function (s, k) {
const reverse = (strArr, start, end) => {
for (let i = start, j = end - 1; i < j; i++, j--) {
[strArr[i], strArr[j]] = [strArr[j], strArr[i]];
}
return strArr;
}
const round = Math.ceil(s.length / (2 * k));
const strArr = s.split('');
for (let roundIndex = 0; roundIndex < round; roundIndex++) {
const start = roundIndex * 2 * k;
if (strArr.length <= start + k) {
reverse(strArr, start, strArr.length);
} else if (strArr.length > start + k) {
reverse(strArr, start, start + k);
}
}
return strArr.join('');
};
替换空格
本题实际上不需要用额外辅助空间。使用双指针法,从后向前替换空格即可。过程如下:

代码如下:
var replaceSpace = function (s) {
const strArr = s.split('');
const spaceCount = strArr.reduce((total, charCode) => {
if (charCode === ' ') {
total++;
}
return total;
}, 0);
const newStrArr = [];
const newStrLength = strArr.length + spaceCount * 2;
let j = newStrLength - 1;
for (let i = strArr.length - 1; i >= 0; i--) {
if (strArr[i] === ' ') {
newStrArr[j] = '0';
newStrArr[j - 1] = '2';
newStrArr[j - 2] = '%';
j = j - 3;
} else {
newStrArr[j] = strArr[i];
j--;
}
}
return newStrArr.join('');
};
翻转字符串里的单词
本题的解题思路如下:
- 移除多余空格
- 将整个字符串反转
- 将每个单词反转
举个例子,源字符串为:"the sky is blue "
- 移除多余空格 : "the sky is blue"
- 字符串反转:"eulb si yks eht"
- 单词反转:"blue is sky the"
多余的空格可以使用双指针法移除。
代码如下:
var reverseWords = function (s) {
const strArr = s.trim().split('');
let isPreValidCode = false;
let slow = 0;
for (let i = 0; i < strArr.length; i++) {
if (strArr[i] !== ' ') {
strArr[slow] = strArr[i];
slow++;
isPreValidCode = true;
} else {
if (isPreValidCode) {
strArr[slow] = strArr[i];
slow++;
}
isPreValidCode = false;
}
}
let newStrArr = strArr.reduce((arr, code, index) => {
if (index < slow) {
arr.push(code);
}
return arr;
}, []);
const reverse = (arr, start, end) => {
for (let i = start, j = end; i < j; i++, j--) {
[arr[i], arr[j]] = [arr[j], arr[i]];
}
return arr;
}
reverse(newStrArr, 0, newStrArr.length - 1);
for (let i = 0, j = 0; j < newStrArr.length + 1; j++) {
if (newStrArr[j] === ' ' || j === newStrArr.length) {
reverse(newStrArr, i, j - 1);
i = j + 1;
}
}
return newStrArr.join('');
};
左旋转字符串
本题的关键是如何使用反转函数。具体步骤:
- 反转区间为前n的子串
- 反转区间为n到末尾的子串
- 反转整个字符串
例如:字符串abcdefg,n=2

代码实现如下:
var reverseLeftWords = function (s, n) {
const reverse = (arr, start, end) => {
for (let i = start, j = end; i < j; i++, j--) {
[arr[i], arr[j]] = [arr[j], arr[i]];
}
return arr;
}
const strArr = s.split('');
reverse(strArr, 0, n - 1);
reverse(strArr, n, strArr.length - 1);
reverse(strArr, 0, strArr.length - 1);
return strArr.join('');
};
这篇博客介绍了LeetCode中关于字符串操作的四道题目,包括反转字符串、反转字符串II、替换空格、翻转字符串里的单词以及左旋转字符串。通过双指针和字符串反转技巧解决这些问题,提供了详细的解题思路和代码实现。
1634

被折叠的 条评论
为什么被折叠?



