翻转字符串里的单词
leetcode链接:leetcode.cn/problems/re…
在不考虑多余空格的情况下,思路是先把整个字符串反转,然后再反转每一个单词
使用双指针来处理多余的空格,参考27.移除元素的思路
快指针:寻找符合新数组的元素
慢指针:更新新数组对应下标的元素
var reverseWords = function(s) {
s = Array.from(s);
removeExtraSpaces(s);
// 翻转整个字符串
reverse(s, 0, s.length);
// 翻转每个单词
let start = 0;
for(let i = 0; i <= s.length;i++) {
if (s[i] === " " || i === s.length) {
reverse(s, start, i - 1);
start = i + 1;
}
}
return s.join("");
};
var removeExtraSpaces = function(strArr) {
let slow = 0;
for(let fast = 0; fast < strArr.length;fast++) {
if (strArr[fast] !== " ") {
// 除了第一个单词,其他单词需要在前面添加一个空格
if (slow !== 0) {
strArr[slow++] = " ";
}
// 批量移动每个单词元素
while(fast < strArr.length && strArr[fast] !== " ") {
strArr[slow++] = strArr[fast++];
}
}
}
// 移除尾部空格,直接修改数组的长度即可
strArr.length = slow;
}
var reverse = function(strArr, start, end) {
let left = start;
let right = end;
while (left <= right) {
[strArr[left], strArr[right]] = [strArr[right], strArr[left]];
left++;
right--;
}
}
右旋转字符串
和上一道题目思路相似,先整体反转,再分段反转
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const reverse = function(arr, left, right) {
while(left < right) {
let temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
let lines = [];
rl.on('line', function(line){
lines.push(line.trim());
if (lines.length === 2) {
let n = lines[0];
let strArr = lines[1].split('');
let length = strArr.length;
// 整体反转
reverse(strArr, 0, length - 1);
// 分段反转
reverse(strArr, 0, n - 1);
reverse(strArr, n, length - 1);
console.log(strArr.join(''));
}
});