最初と最後にスペースがある文字列がある場合は、文字列を逆にしてください。最初と最後に余分なスペースを入れることはできません。すべてスペースの場合は、元の文字列を返してください。
たとえば、
“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)、元の文字列に反転がないため、追加のスペースが必要です