@@ -300,6 +300,94 @@ class Solution {
300
300
}
301
301
```
302
302
303
+ ``` java
304
+ // 解法二:创建新字符数组填充。时间复杂度O(n)
305
+ class Solution {
306
+ public String reverseWords (String s ) {
307
+ // 源字符数组
308
+ char [] initialArr = s. toCharArray();
309
+ // 新字符数组
310
+ char [] newArr = new char [initialArr. length+ 1 ];// 下面循环添加"单词 ",最终末尾的空格不会返回
311
+ int newArrPos = 0 ;
312
+ // i来进行整体对源字符数组从后往前遍历
313
+ int i = initialArr. length- 1 ;
314
+ while (i>= 0 ){
315
+ while (i>= 0 && initialArr[i] == ' ' ){i-- ;} // 跳过空格
316
+ // 此时i位置是边界或!=空格,先记录当前索引,之后的while用来确定单词的首字母的位置
317
+ int right = i;
318
+ while (i>= 0 && initialArr[i] != ' ' ){i-- ;}
319
+ // 指定区间单词取出(由于i为首字母的前一位,所以这里+1,),取出的每组末尾都带有一个空格
320
+ for (int j = i+ 1 ; j <= right; j++ ) {
321
+ newArr[newArrPos++ ] = initialArr[j];
322
+ if (j == right){
323
+ newArr[newArrPos++ ] = ' ' ;// 空格
324
+ }
325
+ }
326
+ }
327
+ // 若是原始字符串没有单词,直接返回空字符串;若是有单词,返回0-末尾空格索引前范围的字符数组(转成String返回)
328
+ if (newArrPos == 0 ){
329
+ return " " ;
330
+ }else {
331
+ return new String (newArr,0 ,newArrPos- 1 );
332
+ }
333
+ }
334
+ }
335
+ ```
336
+
337
+ ``` java
338
+ // 解法三:双反转+移位,在原始数组上进行反转。空间复杂度O(1)
339
+ class Solution {
340
+ /**
341
+ * 思路:
342
+ * ①反转字符串 "the sky is blue " => " eulb si yks eht"
343
+ * ②遍历 " eulb si yks eht",每次先对某个单词进行反转再移位
344
+ * 这里以第一个单词进行为演示:" eulb si yks eht" ==反转=> " blue si yks eht" ==移位=> "blue si yks eht"
345
+ */
346
+ public String reverseWords (String s ) {
347
+ // 步骤1:字符串整体反转(此时其中的单词也都反转了)
348
+ char [] initialArr = s. toCharArray();
349
+ reverse(initialArr, 0 , s. length() - 1 );
350
+ int k = 0 ;
351
+ for (int i = 0 ; i < initialArr. length; i++ ) {
352
+ if (initialArr[i] == ' ' ) {
353
+ continue ;
354
+ }
355
+ int tempCur = i;
356
+ while (i < initialArr. length && initialArr[i] != ' ' ) {
357
+ i++ ;
358
+ }
359
+ for (int j = tempCur; j < i; j++ ) {
360
+ if (j == tempCur) { // 步骤二:二次反转
361
+ reverse(initialArr, tempCur, i - 1 );// 对指定范围字符串进行反转,不反转从后往前遍历一个个填充有问题
362
+ }
363
+ // 步骤三:移动操作
364
+ initialArr[k++ ] = initialArr[j];
365
+ if (j == i - 1 ) { // 遍历结束
366
+ // 避免越界情况,例如=> "asdasd df f",不加判断最后就会数组越界
367
+ if (k < initialArr. length) {
368
+ initialArr[k++ ] = ' ' ;
369
+ }
370
+ }
371
+ }
372
+ }
373
+ if (k == 0 ) {
374
+ return " " ;
375
+ } else {
376
+ // 参数三:以防出现如"asdasd df f"=>"f df asdasd"正好凑满不需要省略空格情况
377
+ return new String (initialArr, 0 , (k == initialArr. length) && (initialArr[k - 1 ] != ' ' ) ? k : k - 1 );
378
+ }
379
+ }
380
+
381
+ public void reverse (char [] chars , int begin , int end ) {
382
+ for (int i = begin, j = end; i < j; i++ , j-- ) {
383
+ chars[i] ^ = chars[j];
384
+ chars[j] ^ = chars[i];
385
+ chars[i] ^ = chars[j];
386
+ }
387
+ }
388
+ }
389
+ ```
390
+
303
391
python:
304
392
305
393
``` Python
0 commit comments