本文參考自《劍指offer》一書,代碼采用Java語言。
題目
輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。為簡單起見,標點符號和普通字母一樣處理。例如輸入字符串"I am a student. ",則輸出"student. a am I"。
思路
一開始自己覺得要用split()方法,但這要開辟新的數組,占內存空間,不行。
首先實現翻轉整個句子:只需要在首尾兩端各放置一個指針,交換指針所指的數字,兩端指針往中間移動即可。之后根據空格的位置,對每個單詞使用同樣的方法翻轉即可。
測試算例
1.功能測試(句子中有一個/多個單詞,空格在開頭、中間、結尾)
2.邊界值測試(null,空字符串,句子全為空格)
Java代碼
//題目:輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。
//為簡單起見,標點符號和普通字母一樣處理。例如輸入字符串"I am a student. ",
//則輸出"student. a am I"。
public class ReverseWordsInSentence {
public String ReverseSentence(char[] chars) {
if(chars==null || chars.length<=0)
return String.valueOf(chars);
//翻轉整個句子
reverseSb(chars,0,chars.length-1);
//翻轉單詞(指針指向單詞的第一個和最后一個)
int start=0;
int end=0;
while(start<chars.length){
while(end<chars.length && chars[end]!=' ')
end++;
reverseSb(chars,start,end-1);
start=++end;
}
/*翻轉單詞的另一種寫法(指針指向blank位置)
int blank = -1;
for(int i = 0;i < chars.length;i++){
if(chars[i] == ' '){
int nextBlank = i;
reverse(chars,blank + 1,nextBlank - 1);
blank = nextBlank;
}
}
reverse(chars,blank + 1,chars.length - 1);//最后一個單詞單獨進行反轉
*/
return String.valueOf(chars);
}
private void reverseSb(char[] chars,int start,int end){
while(start<end){
char temp=chars[start];
chars[start]=chars[end];
chars[end]=temp;
start++;
end--;
}
}
}
收獲
1.翻轉字符串方法get√
