diff --git a/problems/0151.翻转字符串里的单词.md b/problems/0151.翻转字符串里的单词.md index 8d28b332..bf274263 100644 --- a/problems/0151.翻转字符串里的单词.md +++ b/problems/0151.翻转字符串里的单词.md @@ -300,6 +300,94 @@ class Solution { } ``` +```java +//解法二:创建新字符数组填充。时间复杂度O(n) +class Solution { + public String reverseWords(String s) { + //源字符数组 + char[] initialArr = s.toCharArray(); + //新字符数组 + char[] newArr = new char[initialArr.length+1];//下面循环添加"单词 ",最终末尾的空格不会返回 + int newArrPos = 0; + //i来进行整体对源字符数组从后往前遍历 + int i = initialArr.length-1; + while(i>=0){ + while(i>=0 && initialArr[i] == ' '){i--;} //跳过空格 + //此时i位置是边界或!=空格,先记录当前索引,之后的while用来确定单词的首字母的位置 + int right = i; + while(i>=0 && initialArr[i] != ' '){i--;} + //指定区间单词取出(由于i为首字母的前一位,所以这里+1,),取出的每组末尾都带有一个空格 + for (int j = i+1; j <= right; j++) { + newArr[newArrPos++] = initialArr[j]; + if(j == right){ + newArr[newArrPos++] = ' ';//空格 + } + } + } + //若是原始字符串没有单词,直接返回空字符串;若是有单词,返回0-末尾空格索引前范围的字符数组(转成String返回) + if(newArrPos == 0){ + return ""; + }else{ + return new String(newArr,0,newArrPos-1); + } + } +} +``` + +```java +//解法三:双反转+移位,在原始数组上进行反转。空间复杂度O(1) +class Solution { + /** + * 思路: + * ①反转字符串 "the sky is blue " => " eulb si yks eht" + * ②遍历 " eulb si yks eht",每次先对某个单词进行反转再移位 + * 这里以第一个单词进行为演示:" eulb si yks eht" ==反转=> " blue si yks eht" ==移位=> "blue si yks eht" + */ + public String reverseWords(String s) { + //步骤1:字符串整体反转(此时其中的单词也都反转了) + char[] initialArr = s.toCharArray(); + reverse(initialArr, 0, s.length() - 1); + int k = 0; + for (int i = 0; i < initialArr.length; i++) { + if (initialArr[i] == ' ') { + continue; + } + int tempCur = i; + while (i < initialArr.length && initialArr[i] != ' ') { + i++; + } + for (int j = tempCur; j < i; j++) { + if (j == tempCur) { //步骤二:二次反转 + reverse(initialArr, tempCur, i - 1);//对指定范围字符串进行反转,不反转从后往前遍历一个个填充有问题 + } + //步骤三:移动操作 + initialArr[k++] = initialArr[j]; + if (j == i - 1) { //遍历结束 + //避免越界情况,例如=> "asdasd df f",不加判断最后就会数组越界 + if (k < initialArr.length) { + initialArr[k++] = ' '; + } + } + } + } + if (k == 0) { + return ""; + } else { + //参数三:以防出现如"asdasd df f"=>"f df asdasd"正好凑满不需要省略空格情况 + return new String(initialArr, 0, (k == initialArr.length) && (initialArr[k - 1] != ' ') ? k : k - 1); + } + } + + public void reverse(char[] chars, int begin, int end) { + for (int i = begin, j = end; i < j; i++, j--) { + chars[i] ^= chars[j]; + chars[j] ^= chars[i]; + chars[i] ^= chars[j]; + } + } +} +``` + python: ```Python