给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
要点:反转字符但是只是其中的单词反转,开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。如此循环多次,直到遍历完原字符串,就能得到翻转后的结果。这其中包括一个新函数,StringBuffer中的append将新字符插入到一个位置中。
代码:class Solution {
public String reverseWords(String s) {
StringBuffer ret=new StringBuffer();
int length=s.length();
int i=0;
while(i<length){
int start=i;//单词的首字母位置
while(i<length&&s.charAt(i)!=' '){//遇到空格时跳出,此时已标记空格位置
i++;
}
for(int p=start;p<i;p++){
ret.append(s.charAt(i+start-1-p));//i-1为单词末子母位置,-p代表单词长度,从后向前遍历
}
while(i<length&&s.charAt(i)==' '){//进入下一个单词,记录首字母位置,返回给start
i++;
ret.append(' ');//加空格
}
}
return ret.toString();
}
}
(2)另外一种方法就是不借助StringBuilder,直接操作字符数组,把String转为字符数组,原地操作,然后再把字符数组转成String返回。
用双指针指向原数组中的单词首尾,进行反转,然后向前步进到下一个单词。
代码:class Solution {
public String reverseWords(String s) {
char[] chars = s.toCharArray();
for (int i = 0, j = 0; i <= chars.length; i++) {
if (i == chars.length || chars[i] == ' ') {
int k = i - 1;
while (j < k) {
char t = chars[k];
chars[k] = chars[j];
chars[j] = t;
j++;
k--;
}
j = i + 1;
}
}
return new String(chars);
}
}