题目 点击前往
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。 说明: * 输入字符串 s 可以在前面、后面或者单词间包含多余的空格。 * 翻转后单词间应当仅用一个空格分隔。 * 翻转后的字符串中不应包含额外的空格。
示例1:
1 2 输入:s = "the sky is blue" 输出:"blue is sky the"
示例2:
1 2 3 输入:s = " hello world " 输出:"world hello" 解释:输入字符串可以在前面或者后面包含多余的空格,但是翻转后的字符不能包括。
解题思路
方法一:调用库函数直接操作。
方法二:自定义函数。
自定义函数 创建去空格函数
依题意需要去除的空格类型包括:
这里利用双指针法:
fast指针走得快,slow指针走得慢;
当fast指针遇到空格时进行判断,如果出现以上两种情况就将fast指针继续向前走;否则,将fast指针指向的位置的元素赋予给slow指针对应元素,然后同时移动两个指针。
最后利用slow指针来去除结尾空格,然后控制整个字符串长度。
1 2 3 4 5 6 7 8 9 10 11 function dp (arr ){ let fast = 0 , slow = 0 ; while (fast < arr.length ){ if (arr[fast]===" " && (fast ===0 || arr[fast-1 ]===" " )){ fast++; }else { arr[slow++] = arr[fast++]; } } arr.length = arr[slow - 1 ] === " " ? slow -1 : slow; }
创建翻转函数
这里翻转函数先用来对整个数组进行翻转,然后利用空格为间隔将每个单词进行翻转。
1 2 3 4 5 6 7 8 9 function reversefun (arr,start,end ){ let left = start; let right = end; while (left < right){ [arr[left],arr[right]] = [arr[right],arr[left]]; left++; right--; } }
函数整体 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 var reverseWords = function (s ) { let arr = Array .from (s); dp (arr); reversefun (arr, 0 ,arr.length -1 ); let start = 0 ; for (let i=0 ; i<= arr.length ;i++){ if (arr[i]===' ' || i ===arr.length ){ reversefun (arr,start,i-1 ); start = i+1 ; } } return arr.join ("" ); }; function dp (arr ){ let fast = 0 , slow = 0 ; while (fast < arr.length ){ if (arr[fast]===" " && (fast ===0 || arr[fast-1 ]===" " )){ fast++; }else { arr[slow++] = arr[fast++]; } } arr.length = arr[slow - 1 ] === " " ? slow -1 : slow; } function reversefun (arr,start,end ){ let left = start; let right = end; while (left < right){ [arr[left],arr[right]] = [arr[right],arr[left]]; left++; right--; } }