代码随想录算法训练营第十四天(2)|151.翻转字符串里的单词
文档讲解:代码随想录
难度:easy
附:冲
passion!!!passion!!!passion!!!
151.翻转字符串里的单词
力扣题目链接(opens new window)
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个
思路
- 首先将获取的参数赋值给一个数组,再创建c一个用来返回的数组(多出来的一个位置是为了在添加单词时,每个单词后面可以添加一个空格。最终,末尾的空格不会被返回。)、
创建
一个指newArrPos
针,用于跟踪新字符数组newArr
的当前位置。初始值为 0,表示从newArr
的第一个位置开始填充。- i来进行整体对源字符数组从后往前遍历
- 进入循环:如果是空i--,否则记录当前索引值然后如果不是空i--
- 提取单词(用到了right为临界)
- 最后如果为空,则返回空,否则通过 String(newArr,0,newArrPos-1)来提取
newArr
中有效部分(即反转后的单词序列),并去掉最后一个多余的空格。
补充
String(newArr, 0, newArrPos - 1)
这行代码的作用是从字符数组newArr
中创建一个新的字符串。它的参数含义如下:
newArr
: 这是源字符数组,包含了反转后的单词以及每个单词后面的空格。
0
: 这是起始索引,表示从newArr
的第 0 个位置开始创建字符串。
newArrPos - 1
: 这是结束索引,表示字符串的结束位置是newArrPos - 1
。具体作用
这行代码的目的是从
newArr
中提取有效部分(即反转后的单词序列),并去掉最后一个多余的空格。
newArrPos
是newArr
的当前填充位置,指向最后一个有效字符的下一个位置。由于每个单词后面都添加了一个空格,
newArrPos - 1
会去掉最后一个单词后面的空格。
代码
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);
}
}
}