Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ff44674

Browse files
committed
更新了0151.翻转字符串里的单词Java两种解法1字符数组填充2双反转+移位
1 parent b63cee3 commit ff44674

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+
* 1反转字符串 "the sky is blue " => " eulb si yks eht"
343+
* 2遍历 " 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)

AltStyle によって変換されたページ (->オリジナル) /