字符串反轉句子StringReverseSentence

/**
 * @author LemonLin
 * @Description :ReverseSentence42_1
 *翻轉單詞順序列
 *
 * 牛客最近來了一個新員工Fish,每天早晨總是會拿着一本英文雜誌,寫些句子在本子上。
 * 同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。
 * 例如,“student. a am I”。後來才意識到,這傢伙原來把句子單詞的順序翻轉了,
 * 正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?
 *
 * 思路:先翻轉全部的字符串,再翻轉每個空格分割的單詞字符串。
 * 本題調試bug的時候遇到很多例子無法通過:總結如下:
 * 1、翻轉過程出錯:就是對應不上,代碼出錯部分,就是設置一個j的變量,j變化01234...start+j與end-j互相交換
 *2、如果只有空格字符,需要返回空格,用str.trim().equals("")
 * 3、如果是字符串是偶數個數(字符數組首字符下標是0),那麼翻轉的middle值爲 (start+end)/2+1;
 *      爲什麼加一,如果字符數組下標是012345,則必須爲middle爲3,小於號(0+5)/2=2,加一,則爲3
 * 4、需要用下標來進行翻轉,所以把輸入的字符串轉換爲字符數組,用到 str.toCharArray();
 *      轉換完之後再把字符數組轉換爲字符串String.valueOf(chars);
 *
 * 5、需要考慮輸入的字符串沒有空格分割的時候,那麼翻轉之後還要再翻轉回來,用一個標誌位進行標記
 * 6、如有空格的話,最後一個單詞由於沒有空格來做分割線,所以需要特殊翻轉最後一個
 * 7、數組作爲輸入,一般情況下需要至少兩個參數,一個是數組,一個是數組長度
 * @date 2018/6/12-15:29
 */
public class StringReverseSentence42_1 {
    /**
     *     翻轉思路是用一箇中間的變量來存,頭尾互相交換,翻轉的終止條件是到字符串的中間
      */
    public String ReverseSentence(String str) {
        if(str == null||str.trim().equals("")){
            return str;
        }
        char [] chars = str.toCharArray();
        //翻轉整個句子
        Reverse(chars,0,chars.length-1);
        //翻轉句子中的每個單詞
        int j=0;
        int start = j;
        boolean flag = false;
        while (j<chars.length){
            if (chars[j]==' '){
                flag = true;
                int end = j-1;
                j++;
                Reverse(chars,start,end);
                start = j;
            }
            j++;
        }
        /*5、需要考慮輸入的字符串沒有空格分割的時候,那麼翻轉之後還要再翻轉回來,用一個標誌位進行標記*/
        if (flag ==false){
            Reverse(chars,0,chars.length-1);
        }
        /* * 6、如有空格的話,最後一個單詞由於沒有空格來做分割線,所以需要特殊翻轉最後一個*/
        if (flag == true){
            Reverse(chars,start,chars.length-1);
        }
        String strChange=String.valueOf(chars);
        return strChange;
    }
    //start 的參數爲數組開頭,end的參數爲數組的結尾;
    //數組作爲輸入,一般情況下需要至少兩個參數,一個是數組,一個是數組長度
    /**
     * 3、如果是字符串是偶數個數(字符數組首字符下標是0),那麼翻轉的middle值爲 (start+end)/2+1;
     *      爲什麼加一,如果字符數組下標是012345,則必須爲middle爲3,因爲for循環中i<middle注意體會這個小於號,
     *      而不是小於等於號,小於號(0+5)/2=2,加一,則爲3*/
    public void Reverse(char[] chars,int start,int end){
        char  temp= ' ';
        int isZero = (start+end)%2;
        int middle = 0;
        if (isZero == 0){
            middle = (start+end)/2;
        }else {
            middle = (start+end)/2+1;
        }
        int j=0;
        for (int i =start;i<middle;i++){
            temp = chars[start+j];
            chars [start+j] = chars[end-j];
            chars[end-j] = temp;
            j++;
        }
    }
    public static void main(String[] args) {
        String string = "i am a student.";
        StringReverseSentence42_1 stringReverseSentence42_1 = new StringReverseSentence42_1();
        String s = stringReverseSentence42_1.ReverseSentence(string);
        System.out.println(s);
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章