mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 16:54:50 +08:00
更新了0151.翻转字符串里的单词Java两种解法①字符数组填充②双反转+移位
This commit is contained in:
@ -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
|
||||
|
Reference in New Issue
Block a user