https://leetcode.com/problems/reverse-words-in-a-string/
给定一个String,求出这个String 的字符串反转,反转后的以空格为区分的单词需要保持原顺序
例如String = "the sky is blue" ,反转后的结果为"blue is sky the",附加条件:两个单词之间或者句子的收尾可能有多个空格,需要去除掉这些多余的空格,例如String = " hello world! " ,反转后的结果应该为"world! hello"
思路(String 中没有多余空格)
先说没有多个空格的做法,思路很多,常见的有,直接反转原String,然后以空格为区分,再对每个单词做反转
public String reverseWords(String s) {
if (s == null) {
return s;
}
String revS = reverse(s, 0, s.length() - 1);
StringBuilder res = new StringBuilder();
int start = 0, end = 1;
while (end < s.length()) {
if (revS.charAt(end) == ' ') {
revS = reverse(revS, start, end - 1);
start = end + 1;
}
end++;
}
revS = reverse(revS, start, end - 1);
return revS;
}
public String reverse(String s, int i, int j) {
if (s == null || i >= j) {
return s;
}
StringBuilder s1 = new StringBuilder(s);
// s1.setCharAt(0,'') = 's';
while (i <= j) {
char tmp = s1.charAt(i);
s1.setCharAt(i, s1.charAt(j));
s1.setCharAt(j, tmp);
i++;
j--;
}
return new String(s1);
}
思路2(String中有多余空格)
如果String有多余空格,不能按照翻转句子,再翻转单词的标准来进行操作了,因为,可以以一个StringBuilder做为变量,逐步遍历每一个char
talk is cheap,show me your example
" hello world! "
-------------------------------------------------
整体翻转 sb = " !dlrow olleh "
storeIndex 记录翻转后的单词末尾Index
-------------------------------------------------
i = 0 sb[0] == ' ' 继续
-------------------------------------------------
i = 1 sb[1] == ' ' 继续
-------------------------------------------------
i = 2 sb[2] == ' h' ,因为此时storeIndex为0,表明上一个没单词,不用再sb的storeIndex的位置加‘ ’
j = i,
遍历到j为' '的时候循环终止,得到sb = '!dlrowow olleh '
此时storeIndex = 6,j = 8;
针对storeIndex前面的单词,进行翻转,得到sb = 'world!ow olleh '
置放i = j = 8
-------------------------------------------------
i = 9 sb[2] == ' o' ,因为此时storeIndex为6,表明上一个有单词,需要sb后面加一个' ',所以此时sb = sb = 'world! w olleh '
j=i
遍历到j为' '的时候循环终止,得到sb = 'world! olleheh '
此时storeIndex=12,j=14
针对storeIndex前面的单词,进行翻转,得到sb = 'world! helloeh '
i = j = 14;
-------------------------------------------------
i = 14 结束循环
设置sb为当前长度
StringBuilder有reverse的函数
public String reverseWords2(String s) {
int storeIndex = 0, n = s.length();
StringBuilder sb = new StringBuilder(s).reverse();
for (int i = 0; i < n; ++i) {
if (sb.charAt(i) != ' ') {
if (storeIndex != 0) sb.setCharAt(storeIndex++, ' ');
int j = i;
while (j < n && sb.charAt(j) != ' ') {
sb.setCharAt(storeIndex++, sb.charAt(j++));
}
String t = new StringBuilder(sb.substring(storeIndex - (j - i), storeIndex)).reverse().toString();
sb.replace(storeIndex - (j - i), storeIndex, t);
i = j;
}
}
sb.setLength(storeIndex);
return sb.toString();
}
网友评论