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

 

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

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

題目

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

思路

  一開始本身以爲要用split()方法,但這要開闢新的數組,佔內存空間,不行。
post

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

 

測試算例 url

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

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

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√blog

  

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

相關文章
相關標籤/搜索