给定一个首尾可能带空格的字符串,请让你翻转该字符串。首尾不能有多余空格。如果全部是空格,请返回原字符串。
例如将
“student. a am I”
翻转为“I am a student.”
首先需要进行预处理,判断输入字符串是不是全部空格,如果是,直接输出字符串。
把每个单词拆分出来,然后以单词为翻转单元,即可得到结果串。
一个单词为:从不是空格的字符开始到是空格的前一个字符结束,即为一个单词。
public class Solution {
public String ReverseSentence(String str) {
if(str == null) return str;
int len = str.length();
int i = 0;
while(i<len && str.charAt(i) == ' ') i++;
if(i == len) return str;
String res = "";
String tmp = "";
boolean hasWord = false; // 是否已经形成一个单词
for(int j = len-1; j >=0; j--){
if(str.charAt(j) != ' '){
tmp = str.charAt(j) + tmp;
hasWord = true;
}else if(str.charAt(j) == ' ' && hasWord == true){
res = res + tmp + " ";
tmp = ""; // 重置 tmp
hasWord = false; // 重置 hasWord
}
}
if(tmp != ""){
res += tmp;
}
return res;
}
}
用StringBuilder
实现:
public class Solution {
public String ReverseSentence(String str) {
if(str == null) return str;
int len = str.length();
int i = 0;
while(i<len && str.charAt(i) == ' ') i++;
if(i == len) return str;
StringBuilder res = new StringBuilder();
StringBuilder tmp = new StringBuilder();
boolean hasWord = false;
for(int j = len-1; j >=0; j--){
if(str.charAt(j) != ' '){
tmp.insert(0,str.charAt(j));
hasWord = true;
}else if(str.charAt(j) == ' ' && hasWord == true){
res = res.append(tmp).append(" ");
//tmp = new StringBuilder();
tmp.delete(0, tmp.length()); // 这里用delete避免产生新的对象
hasWord = false;
}
}
if(tmp.length() != 0){
res.append(tmp);
}
str = res.toString();
return str;
}
}
时间复杂度:O(N)
空间复杂度:O(N),因为没有在原字符串上进行翻转,所以需要额外的空间