劍指44.翻轉單詞順序
阿新 • • 發佈:2020-08-26
題目描述
輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。為簡單起見,標點符號和普通字母一樣處理。例如輸入字串"I am a student. ",則輸出"student. a am I"。思路
思路1:考察字串翻轉。該題需要兩次翻轉,以輸入字串"I am a student. "為例。
- Step1.先翻轉整個句子,得到".tneduts a ma I"
- Step2.再翻轉句中每個單詞,得到"student. a am I"。
需要注意的是,要對句子最後一個單詞單獨翻轉。另外,牛客測試用例不用考慮刪除多個空格,而力扣需要考慮。以下解法暫不考慮刪除多餘的空格。
特殊測試用例:字串中只有空格。
思路2:使用str.split(
" "
)將一個字串分成多個,再反向新增。
解法1.1(手寫reverse)
public class Solution { /* * 先翻轉整個句子,然後,依次翻轉每個單詞。 * 依據空格來確定單詞的起始和終止位置,最後一個單詞要單獨處理 */ public String ReverseSentence(String str) { if (str == null || str.length() == 0) return str; char[] chars = str.toCharArray(); reverse(chars,0,str.length()-1); // Step1.先翻轉整個句子 int index = 0; for (int i = 0; i < chars.length; i++) { //Step2.再翻轉句中每個單詞 if (chars[i] == ' '){ reverse(chars,index,i - 1); index = i + 1; }else if ((i == chars.length - 1)){ // 最後一個單詞要單獨翻轉。 reverse(chars,index,i); //或者要考慮到特例,一個句子只有一個單詞,那麼也就沒有空格。 } } return String.valueOf(chars); } private void reverse(char[] chars,int start, int end){ while (start < end){ char temp = chars[start]; chars[start] = chars[end]; chars[end] = temp; start++; end--; } } }
解法1.2(呼叫API)
public class Solution { public String ReverseSentence(String str) { // 注意測試用例要考慮到字串中全為空格的情況;String.trim():去掉字串首尾的空格。 if (str == null || str.length() == 0 || str.trim().length() ==0) return str; String flipStr = new StringBuilder(str).reverse().toString(); // 對整個句子翻轉 StringBuilder res = new StringBuilder(); // 用來儲存結果 StringBuilder temp = new StringBuilder(); // 用來遍歷每個單詞 for (int i = 0; i < flipStr.length(); i++) { if (flipStr.charAt(i) == ' '){ //對每個單詞翻轉(給出兩種新增方式) //res.append(res.length() == 0 ? temp.reverse().toString() : " "+temp.reverse()); //在每個單詞前新增空格 res.append(temp.reverse().toString()).append(" "); // 在每個單詞後加空格 temp = new StringBuilder(); // 初始化 }else{ temp.append(flipStr.charAt(i)); } } // 最後那個單詞單獨處理 res.append(temp.reverse().toString()); //res.append(res.length() == 0 ? temp.reverse().toString() : " "+temp.reverse()); return res.toString(); } }
解法2
public class Solution { public String ReverseSentence(String str) { if (str == null || str.length() == 0 || str.trim().length() ==0)//需要將多個空格的情況考慮進來 return str; StringBuilder sb = new StringBuilder(); String[] strSet = str.split(" "); //將一個字串分成多個單詞後,裝數組裡 for (int i = strSet.length - 1; i > 0; i--) { sb.append(strSet[i] + " "); //從尾部新增就可以保證順序顛倒了 } sb.append(strSet[0]);//寫在外面是因為最後一個新增的不用新增空格了。 return sb.toString(); } }
參考:
《劍指offer》 第58.1題 翻轉字串之翻轉單詞順序