劍指offer-42翻轉單詞順序-左旋轉字符串

 

題意

題目描述

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

 

樣例輸入

student. a am I

I’m a Freshman and I like JOBDU!

樣例輸出

I am a student.

JOBDU! like I and Freshman a I’m

先反轉整個字符串,再將每個單詞內部翻轉

先寫一個reverse方法,將整個字符串都翻轉一下,每次定義一個變量記錄空白的位置,然後遞歸的使用reverse方法。

注:本題的i的變量,從後往前算。

 

package cn.com;

public class ReverseSentence {
    public static void main(String[] args) {
        String str = "I am a Student.";
        System.out.println(ReverseSentence(str));

    }
    public static String ReverseSentence(String str) {
        char[] chars = str.toCharArray();
        reverse(chars,0,chars.length - 1);
        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 new String(chars);

    }
    public static String  reverse(char[] chars,int low,int high){
        while(low < high){
            char temp = chars[low];
            chars[low] = chars[high];
            chars[high] = temp;
            low++;
            high--;
        }
        return  chars.toString();
    }
}

如果面試者一下子就回答出來了,面試官會懷疑你之前看過這道題,會問你一個更深入的題。如下,要是左旋字符串,怎麼辦?

將字符串前面的若干字符移到尾部。如輸入“abcdefg”和數字2,表示將前2個字符移到後面。變成“cdefgab”。

思路:三次reverse,前兩次將每個部分的內部翻轉,爲“bagfedc”,第三次整體翻轉,變爲“cdefgab”。

package cn.com;
/*
劍指offer-42-左旋轉字符串
 */

public class LeftReverse {
    public static void main(String[] args) {
        String str = "abcdefg";
        System.out.println(LeftReverse(str,2));

    }
    public static String LeftReverse(String str, int n) {
        char[] chars = str.toCharArray();
        if(chars.length < n) return "";
        reverse(chars, 0, n-1);
        reverse(chars, n, chars.length-1);
        reverse(chars, 0, chars.length-1);
        StringBuilder sb = new StringBuilder(chars.length);
        for(char c:chars){
            sb.append(c);
        }
        return sb.toString();
    }

    public static void reverse(char[] chars,int low,int high){
        char temp;
        while(low<high){
            temp = chars[low];
            chars[low] = chars[high];
            chars[high] = temp;
            low++;
            high--;
        }
    }
}

 

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