字符串 1. 反转字符串 344
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出。
不要给另外的数组分配额外的空间,你必须原地 修改输入数组 、使用 O(1) 的额外空间解决这一问题。
1 2 3 4 5 6 7 8 9 10 11 12 var reverseString = function (s ) { let n=s.length for (let i=0 ;i<n/2 ;i++){ let T=s[i] s[i]=s[n-1 -i] s[n-1 -i]=T } };
2. 反转字符串II 541
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
如果剩余字符少于 k
个,则将剩余字符全部反转。
如果剩余字符小于 2k
但大于或等于 k
个,则反转前 k
个字符,其余字符保持原样。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var reverseStr = function (s, k ) { const n = s.length ; const arr = Array .from (s); for (let i = 0 ; i < n; i += 2 * k) { reverse (arr, i, Math .min (i + k, n) - 1 ); } return arr.join ('' ); } const reverse = (arr, left, right ) => { while (left < right) { const temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } }
3. 反转字符串中的单词 151
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
1 2 3 4 5 var reverseWords = function (s ) { return s.trim ().split (/\s+/ ).reverse ().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 52 53 54 55 56 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--; } }