实例
输入: “the sky is blue”
输出: “blue is sky the”
原理
主要思路:移除多余的空格;将整个字符串反转;将每个单词反转
实现
力扣 151. 反转字符串中的单词
var reverseWords2 = function (s) {
// 字符串不可变,字符串内容修改都是在开辟一个新的空间,所以先变为数组
let strArr = Array.from(s)
// 移除多余的空格
removeExtraSpaces(strArr)
// 将整个字符串反转
reverse(strArr, 0, strArr.length)
// 将每个单词反转
for (let i = 0; i < strArr.length + 1; i++) {
if (strArr[i] === ' ' || i === strArr.length) {
reverse(strArr, start, i)
start = i + 1
}
}
return strArr.join('')
}
// 移除多余的空格(类似于数组移除元素),参数为字符串数组
function removeExtraSpaces(arr) {
// 快指针遍历所有的元素
let fast = 0
// 慢指针保存我们想要的值
let slow = 0
for (let fast = 0; fast < arr.length; fast++) {
if (arr[fast] === ' ' && (fast === 0 || arr[fast - 1] === ' ')) {
continue
} else {
arr[slow] = arr[fast]
slow++
}
}
// 去除数组结尾的空格
arr.length = arr[slow - 1] === ' ' ? slow - 1 : slow
}
// 反转函数,官方定义都是前闭后开
function reverse(s, start, end) {
let left = start
let right = end - 1
while (left < right) {
let temp = s[left]
s[left] = s[right]
s[right] = temp
left++
right--
}
return s
}