題目描述:
給定一個字符串,你需要反轉字符串中每個單詞的字符順序,同時仍保留空格和單詞的初始順序。
示例 1:
輸入: “Let’s take LeetCode contest”
輸出: “s’teL ekat edoCteeL tsetnoc”
注意:在字符串中,每個單詞由單個空格分隔,並且字符串中不會有任何額外的空格。
目標:反轉的是以單詞爲基準的
注意的是最後一個end如果是以空格結尾那麼沒有問題,如果是以單詞結尾就要注意一下,我天我又寫了好長時間,而且效率不是很高
class Solution {
public String reverseWords(String s) {
int start = 0;
int end = 0;
char [] t = s.toCharArray();
StringBuilder sBuilder = new StringBuilder();
while (end < t.length) {
if(t[end] == ' '){
sBuilder.append(new String(rever(start, end, t)).subSequence(start, end + 1));
// System.out.println(sBuilder);
start = end + 1;
end ++;
}else {
end ++;
}
if(end == t.length - 1 && t[end] != ' '){
sBuilder.append(new String(rever(start, end, t)).subSequence(start, end + 1));
end ++;
}
}
return new String(sBuilder);
}
public static char[] rever(int start ,int end,char [] tem){
//反轉從下標爲start到end的字符(不包括end)
if(tem [end] == ' '){
end = end -1;
}
while (start < end) {
char tem1 = tem[start];
tem[start] = tem[end];
tem[end] = tem1;
start ++;
end --;
}
return tem;
}
}
如果使用split呢??
效率提高了
代碼:
class Solution {
public String reverseWords(String s) {
String [] temStrings = s.split(" ");
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < temStrings.length; i++) {
String string = temStrings[i];
if(i == temStrings.length - 1){
sBuilder.append(rever(0, string.length(), string.toCharArray()));
}else {
sBuilder.append(rever(0, string.length(), string.toCharArray())).append(" ");
}
}
return new String(sBuilder);
}
public static char[] rever(int start ,int end,char [] tem){
//反轉從下標爲start到end的字符(不包括end)
end = end - 1;
while (start < end) {
char tem1 = tem[start];
tem[start] = tem[end];
tem[end] = tem1;
start ++;
end --;
}
return tem;
}
}
排名靠前的代碼
class Solution {
public String reverseWords(String s) {
int len = s.length();
if(len <=1) return s;
char[] arr = s.toCharArray();
int start = 0;
while(start < len){
int end = s.indexOf(' ', start);
if(end == -1){
reverse(arr, start, len -1);
break;
}
else{
reverse(arr, start, end - 1);
start = end + 1;
}
}
// return arr.toString();
return String.valueOf(arr);
}
public void reverse(char[] arr, int a , int b){
while(a < b){
char tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
a ++;
b--;
}
}
}