方法一:双指针
1.先使用trim()方法删除单词字符串前后空格字符。
2.用两个指针指向字符串末尾单词(一个快指针,一个慢指针),快指针先向前移动,直到移动到空格字符停下来,然后截取从快指针到慢指针的单词到新开辟的字符串中。
3.快指针再向前移动一位,同时将慢指针指向到快指针的位置,再重复第二步的操作,直到遍历完整个字符串。
4.最后输出截取出的字符串数组。
例如:
" hello world "
1.先使用trim()方法删除单词字符串前后空格字符。
s1=" hello world "-->s1="hello world"
2.用两个指针指向字符串末尾单词(一个快指针,一个慢指针),快指针先向前移动,直到移动到空格字符停下来,然后截取从快指针到慢指针的单词到新开辟的字符串中。
s1="hello world"-->s1="hello world" ,new s2="world"
ij i j
3.快指针再向前移动一位,同时将慢指针指向到快指针的位置,再重复第二步的操作,直到遍历完整个字符串。
-->s1="hello world" --> s1="hello world"
ij i j
s2="world hello"
代码实现:
public String reverseWords(String s) {
//双指针
s=s.trim();
int j=s.length()-1,i=j;
StringBuilder s1=new StringBuilder();
while(i>=0) {
while(i>=0&&s.charAt(i)!=' ')i--;
s1.append(s.substring(i+1,j+1)+' ');
while(i>=0&&s.charAt(i)==' ')i--;
j=i;
}
String s2=s1.toString().trim();
return s2;
}
方法二:字符串双反转+移位
1.首先将整体字符串都翻转过来
“ hello world " -->" dlrow olleh "
2.然后从第一个字符开始向前遍历,从第一个字符开始向前遍历,将第每个单词进行翻转,每翻转一个单词后就进行移位,移位置的操作是为了删除空格字符。
第一个单词翻转:" dlrow olleh "-->" world olleh "
移位操作:
" world olleh "-->"w world olleh "
-->"woworld olleh "-->"wororld olleh "
-->"worlrld olleh "-->"worldld olleh"
3.同理对后面的单词进行相同操作:
最终得到:-->"world hello"
代码实现:
//解法三:双反转+移位,String 的 toCharArray() 方法底层会 new 一个和原字符串相同大小的 char 数组,空间复杂度:O(n)
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];
}
}
}
标签:151,单词,--,initialArr,力扣,2023,字符串,world,指针
From: https://blog.csdn.net/2303_81066780/article/details/140155781