LeetCode/剑指Offer/翻转单词顺序
剑指Offer其他题目代码
【思路】
1.将整个字符串分成形如"ab"结构的子串。
其中,a是由" "组成的,可以为空;b是由非空格的其他字符组成的,也可以为空。
例如字符串" hello world !!! "
可以分成" ","hello ","world ","!!! "这样四个子串。
2.逆序迭代,将每一个子串去掉尾巴的空格后,一一加入StringBuilder的变量中。
例如"!!! "子串,去掉空格:"!!!"
3.因为单词之间需要用" "隔开,所以每一个子串加入的时候,要在后面缀上一个" ",
这样,整个字符串翻转完成后,末尾会多余出一个" ",切掉。
另:也可以用split分割字符串为字符串数组,但是耗时长,见代码2
【举例】
(因为csdn只能上传不超过5M的动图,所以只能上传这个有点模糊的,哭唧唧QAQ)
【代码1】
class Solution {
public String reverseWords(String s) {
if (s.length() == 0) return "";
char[] st = s.toCharArray();
StringBuilder res = new StringBuilder();
for (int i = s.length() - 1, j = i; i >= 0 && j >= 0; ) {
//越过空格
while (j >= 0 && st[j] == ' ') {//循环后,j保存子串最后一个非空字符的位置
j--;
}
if (j < 0)
break;
i = j;
while (j >= 0 && st[j] != ' ') {//循环后,j保存子串第一个非空字符的下一个位置
j--;
}
//i:结束的位置
//j+1:开始的位置
//i-j:子串长度
res.append(st, j + 1, i - j).append(" ");
}
//如果字符串只包含' ',返回""
return res.length() == 0 ? "" : res.substring(0, res.length() - 1);
}
}
【代码2】
class Solution {
public String reverseWords(String s) {
if (s == null || s.length() == 0)
return "";
String[] st = s.trim().split("\\s+");
StringBuilder builder = new StringBuilder();
int len = st.length;
for (int i = len - 1; i >= 0; i--) {
builder.append(st[i] + " ");
}
builder.deleteCharAt(builder.length() - 1);
return builder.toString();
}
}