剑指offer - 翻转单词顺序序列(Java实现)
思路:注意此题目没有 " A " 这种后台样例,所有可以使用 split 来解决这个问题,这个在下面的思路中说到,使用 StringBuilder 来记录答案,首先我们可以遍历字符串,当遇到 ' ' 的时候,如果是第一个 ' ', 此时我们需要翻转前面的字符串,然后拼接到答案中,如果不是则只用拼接 ' ' 即可。这样遍历的时候,最后一个字符串可能无法被我们保存下来,所以在最后如果最后一个字符串还没有被拼接我们就拼接。最后在翻转答案转为字符串返回即可。
public class Solution {
public String ReverseSentence(String str) {
if(str == null || str.equals("")) return "";
int n = str.length();
int pos = 0;
StringBuilder ans = new StringBuilder();
for(int i = 0; i < n; ++ i) {
if(str.charAt(i) == ' ') {
if(i != 0 && str.charAt(i - 1) != ' ') {
ans.append(new StringBuilder(str.substring(pos, i)).reverse());
}
ans.append(" ");
pos = i + 1;
}
}
if(pos < n) ans.append(new StringBuilder(str.substring(pos, n)).reverse());
return ans.reverse().toString();
}
} 这种情况下是可以把末尾空格也进行翻转的。
下面是使用 split 函数分解之后在进行翻转,然后拼接,最后在翻转的结果,特判全都是空格的串可以顺利 AC,但是末尾空格不会进行翻转。
public class Solution {
public String ReverseSentence(String str) {
if(str == null || str.equals("")) return "";
String[] strs = str.split(" ");
if(strs.length <= 0) return str;
StringBuilder[] strs1 = new StringBuilder[strs.length];
for(int i = 0; i < strs.length; ++ i) {
strs1[i] = new StringBuilder(strs[i]);
}
StringBuilder ans = new StringBuilder();
for(int i = 0; i < strs1.length; ++ i) {
strs1[i].reverse();
if(i != 0) ans.append(" ");
ans.append(strs1[i]);
}
return ans.reverse().toString();
}
}
很显然,这种方法没有将末尾的空格进行翻转,但是在这道题目中也顺利 AC 了。
【剑指offer】题目全解 文章被收录于专栏
本专栏主要是刷剑指offer的题解记录

查看1道真题和解析