题意:
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
输入字符串 s 可以在前面、后面或者单词间包含多余的空格。 翻转后单词间应当仅用一个空格分隔。 翻转后的字符串中不应包含额外的空格。
思路:
- 首先将字符串里的多余空格删除,一个是首尾的空格,还有一个是单词间多余的空格。移除空格这一步和之前数组题目的“移除元素”那一题是一样的。末尾空格的删除是设定数组的长度。
- 其次反转整个字符串
- 最后反转每个单词的字符串,每个单词的分界就是空格,找准边界即可
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
const strArr = Array.from(s)
removeExtraSpace(strArr)
reverseStr(strArr,0,strArr.length-1)
let start = 0
for(let i =0;i<=strArr.length;i++){
if(strArr[i]===' '||i ===strArr.length){
reverseStr(strArr,start,i-1)
start = i+1
}
}
return strArr.join('')
};
var removeExtraSpace = function(strArr){
let slowIndex = 0
let fastIndex = 0
//删除数组开头和单词间多余的空格
while(fastIndex<strArr.length){
if(strArr[fastIndex]===' '&&(fastIndex===0 || strArr[fastIndex-1]===' ')){
fastIndex++
}else{
strArr[slowIndex++]=strArr[fastIndex++]
}
}
//删除数组末尾的空格
strArr.length = strArr[slowIndex-1]===' '?slowIndex-1:slowIndex
}
var reverseStr = function(strArr,start,end){
let left = start
let right = end
while(left<right){
[strArr[right],strArr[left]] = [strArr[left],strArr[right]]
left++
right--
}
}