劍指offer—58.翻轉單詞順序列—分析及程式碼(Java)

江南土豆發表於2020-12-31

一、題目

牛客最近來了一個新員工Fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“student. a am I”。後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?

二、分析及程式碼

1. 兩次翻轉

(1)思路

先翻轉各個單詞,再對整個句子進行二次翻轉,即實現目標。

(2)程式碼

public class Solution {
    public String ReverseSentence(String str) {
        if (str.trim().equals(""))
            return str;
        
        char[] chstr = str.toCharArray();
        int l = 0, length = str.length();
        for (int i = 0; i < length; i++) {
            if (chstr[i] == ' ') {
                Reverse(chstr, l, i - 1);
                l = i + 1;
            }
            if (i == length - 1 && l < i)
                Reverse(chstr, l, length - 1);
        }
        
        Reverse(chstr, 0, length - 1);
        return String.valueOf(chstr);
    }
    
    public void Reverse(char[] chstr, int l, int r) {
        int m = (l + r) >> 1;
        for (int i = l; i <= m; i++) {
            char temp = chstr[i];
            chstr[i] = chstr[l + r - i];
            chstr[l + r - i] = temp;
        }
        return;
    }
}

(3)結果

執行時間:21ms,佔用記憶體:9648k。

2. 直接拼接

(1)思路

如果允許使用輔助空間,直接對原字串進行拼接即可。

(2)程式碼

public class Solution {
    public String ReverseSentence(String str) {
        if (str.trim().equals(""))
            return str;
        String[] substr = str.split(" ");
        String ans = substr[substr.length - 1];
        for (int i = substr.length - 2; i >= 0; i--)
            ans = ans.concat(" " + substr[i]);
        return ans;
    }
}

(3)結果

執行時間:20ms,佔用記憶體:9360k。

三、其他

暫無。

相關文章