Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 8fed52d

Browse files
Merge pull request youngyangyang04#877 from changlua/master
更新了0151.翻转字符串里的单词Java两种解法①字符数组填充②双反转+移位
2 parents 1244f1d + ff44674 commit 8fed52d

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

problems/0151.翻转字符串里的单词.md

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,94 @@ class Solution {
300300
}
301301
```
302302

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+
303391
python:
304392

305393
```Python

0 commit comments

Comments
 (0)