1. 程式人生 > >【Java】 劍指offer(58-1) 翻轉單詞順序

【Java】 劍指offer(58-1) 翻轉單詞順序

牛客網 valueof 收獲 java ring 額外 null 翻轉 順序

本文參考自《劍指offer》一書,代碼采用Java語言。

更多:《劍指Offer》Java實現合集

題目

  輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。為簡單起見,標點符號和普通字母一樣處理。例如輸入字符串"I am a student. ",則輸出"student. a am I"。

思路

  一開始自己覺得要用split()方法,但這要開辟新的數組,占內存空間,不行。

  首先實現翻轉整個句子:只需要在首尾兩端各放置一個指針,交換指針所指的數字,兩端指針往中間移動即可。之後根據空格的位置,對每個單詞使用同樣的方法翻轉即可。

測試算例 

  1.功能測試(句子中有一個/多個單詞,空格在開頭、中間、結尾)

  2.邊界值測試(null,空字符串,句子全為空格)

Java代碼

註:本題的隱含條件就是不能用額外的空間;因此下面的代碼中,輸入參數應該是char[] ,而不是String。這裏用的是牛客網上自己寫的代碼,就沒改了。

//題目:輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。
//為簡單起見,標點符號和普通字母一樣處理。例如輸入字符串"I am a student. ",
//則輸出"student. a am I"。

public class ReverseWordsInSentence {
    public String ReverseSentence(String str) {
        if(str==null || str.length()<=0)
            return str;
        char[] chars = str.toCharArray(); 
        //翻轉整個句子
        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;
            }
        }
        */
        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√

  

更多:《劍指Offer》Java實現合集

【Java】 劍指offer(58-1) 翻轉單詞順序