题目(medium)
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
思路
最直白的思路就是 split 倒序然后 join。
提高下难度可以不使用辅助空间,用双指针的思路。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| var reverseWords = function(s) { const strArr = Array.from(s); removeExtraSpaces(strArr); reverse(strArr, 0, strArr.length - 1);
let start = 0;
for(let i = 0; i <= strArr.length; i++) { if (strArr[i] === ' ' || i === strArr.length) { reverse(strArr, start, i - 1); start = i + 1; } }
return strArr.join(''); };
function removeExtraSpaces(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; }
function reverse(strArr, start, end) { let left = start; let right = end;
while(left < right) { [strArr[left], strArr[right]] = [strArr[right], strArr[left]]; left++; right--; } }
|
时间复杂度: O(n)。
空间复杂度: O(1)。