题目描述
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例:
输入:“Let’s take LeetCode contest”
输出:“s’teL ekat edoCteeL tsetnoc”
来源:力扣(LeetCode)
链接:LeetCode
题目分析
(1)由于java中String是不可变对象,因此要考虑在额外的字符数组或者StringBuilder上操作;
(2)用字符数组解时,由于要实现字符串中的单词反转,因此可以实现一个单词的反转方法,具体做法是交换单词的首尾字符,逐步向中间靠拢,完成反转;
(3)而字符串中的单词被空格所隔开,因此遇到空格时,即得到了一个单词,从而可对其调用反转函数,实现反转,而最后一个单词后面没有空格,因此要做特殊处理。
(4)用StringBuilder解时,考虑把每个单词分开,并记录每个单词开头,找到单词最后一个字符,从尾到头把字符添加到新字符串对象;
(5)由于每个单词间以空格隔开,因此每次处理完一个单词要手动添加一个空格,再处理下一个单词;
(6)最后一个单词后面不需要添加空格,可通过判断原来是否有空格从而决定是否添加空格,这样保持了一致性。
代码
class Solution {
public String reverseWords(String s) {
char []words = s.toCharArray();
int start=0; //记录每个单词开头
for(int i=0;i<s.length();i++){
if(words[i]==' '){ //遇到空格时,即得到了一个单词
reverse(words,start,i-1);
start=i+1; //下一个单词的开始
}
if(i==s.length()-1){
reverse(words,start,i);
//最后一个单词做特殊处理,其最右字符即为原字符串最后一个字符
}
}
return new String(words);
}
private void reverse(char []word,int left,int right){
while(left<right){
char tmp = word[right];
word[right]=word[left];
word[left]=tmp;
left++;
right--;
}
}
}
//StringBuilder
class Solution {
public String reverseWords(String s) {
StringBuilder res = new StringBuilder();
int i=0;
while(i<s.length()){
int start = i; //记录每个单词开头
while(i<s.length() && s.charAt(i)!=' '){
i++; //找每个单词的结尾
}
for(int p=i-1;p>=start;p--){
res.append(s.charAt(p)); //把单词加入到字符串
}
while(i<s.length() && s.charAt(i)==' '){
res.append(' '); //原来如果有空格则添加空格
i++;
}
start=i; //记录下一个单词开头
}
return res.toString(); //将StringBuilder对象转为String对象
}
}