1. 程式人生 > 實用技巧 >劍指44.翻轉單詞順序

劍指44.翻轉單詞順序

題目描述

輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。為簡單起見,標點符號和普通字母一樣處理。例如輸入字串"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題 翻轉字串之翻轉單詞順序