面试题58 - I. 翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
方法1. 两次翻转
import java.lang.StringBuilder;
public class Solution {
public String ReverseSentence(String str) {
// " "?首位如果时空格怎么处理??
if(str.length() <=0) return "";
// 第一次全部统一翻转。
StringBuilder s1 = new StringBuilder(str.trim());
s1.reverse();
// 记录前一次翻转后的新单词的位置。
int low = 0;
StringBuilder res = new StringBuilder();
// 记录空格数
int count = 0;
// 逐步遍历反转后的字符串,
for(int i = 0; i < s1.length(); i++){
// 如果遍历到空格,说明[low, i)是一个完整的单词,执行翻转后就回到正常单词。
if(s1.charAt(i) == ' ' && (i != s1.length()-1)){
count++;
StringBuilder s2 = new StringBuilder(s1.substring(low, i));
res.append(s2.reverse().toString() + " ");
low = i+1; // 越过空格
}
// 如果count不为0,说明该字符串包含多个单词,那么最后一个完整的单词后面不再加空格。
if(count != 0 && i == s1.length()-1){
StringBuilder s3 = new StringBuilder(s1.substring(low, i+1));
res.append(s3.reverse());
}
}
// 说明该字符串只含有一个完整的单词,直接返回原来的单词。
if(count == 0){
return str;
}
// 需要把StringBuilder变为String。
return res.toString();
}
}