劍指Offer(Java版):反轉單詞順序VS左旋轉字符串

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

這個題目是流傳甚廣,不少公司都屢次拿來做爲面試題,不少應聘者也多 次在各類博客或者書籍上見到過經過兩次翻轉字符串的解法,因而很快能夠跟面試官說出本身的思路:第一步反轉句子中全部的字符。好比翻轉「I am a Student"中全部的字符獲得」.tneduts a ma i",此時不但翻轉了句子中單詞的順序,連單詞內的字符順序也被翻轉了。第二步再反轉每一個單詞中字符的順序,就獲得了「student. a am I".這正是符合題目要求的輸出。算法

Java代碼實現以下:app

 

package cglib;函數

public class jiekou {
    public static void main(String[] args) {
        jiekou p=new jiekou();
        String string="I am a student.";
        p.reverseSentence(string);
        p.reverseSentence1(string);
        }
    
    public void reverseSentence(String sentence){
        if(sentence==null)
        return;
        String[] str=sentence.split(" ");
        System.out.println("str.length="+str.length);
        StringBuffer sb=new StringBuffer();
        for(int i=str.length-1;i>=0;i--){
        sb.append(str[i]+" ");
        }
        System.out.println(sb);
        }
    
    public void reverseSentence1(String sentence){
        System.out.println("第二個方法");
        if(sentence == null)  
            return;  
        String sentenceReverse = reverse(sentence);  
        String[] splitStrings = sentenceReverse.split(" ");  
        String resultBuffer = "";  
        for(String s:splitStrings)  
            resultBuffer = resultBuffer+reverse(s)+" ";  
        System.out.println(resultBuffer);  
    }  
    
    public String reverse(String str){  
        char[] array = str.toCharArray();  
        for(int i = 0;i<(array.length)/2;i++){  
            char temp = array[i];  
            array[i] = array[array.length-1-i];  
            array[array.length-i-1]=temp;  
        }  
        return String.valueOf(array);  
    }  
        
        }
   字符串

輸出:
str.length=4
student. a am I
第二個方法
student. a am I博客

 

有經驗的面試官看到一個應聘者幾乎不假思索的能想出一種比較巧妙的算法,就會以爲他以前可能見到過這個題目。這個時候不少面試官都會問一個問題,以考察他是否是真的理解了這個算法。面試官一個常見的考察辦法就是問一個相似的但更加難一點的問題。string

 

 

題目二:字符串的左旋轉操做是把字符串前面的若干個字符轉移到字符串的尾部。請定義一個函數實現字符串左旋轉的功能。好比輸入字符串」abcdefg"和數字2,該函數將返回左旋轉2位獲得的結果「cdefgab"it

要找到字符串旋轉時每一個字符移動的規律,不是一件容易的事。那麼咱們 是否是能夠從解決第一個問題的思路中找到啓發呢?在第一個問題中,若是輸入的字符串之中只有兩個單詞,好比」hello World",那麼翻轉這個句子中的單詞順序就獲得了「world hello",比較這兩個字符串,咱們是否是能夠把」world hello"當作是把原始字符串「hello world"的前面若干個字符轉移到後面?也就是說這兩個問題很是類似,咱們一樣能夠經過反轉字符串的辦法來解決第二個問題。class

以」abcdeftg"爲例,咱們能夠把它分爲兩個部分,因爲想把它 的前兩個字符一道後面,咱們就把前面兩個字符分到第一部分,把後面的全部字符都分到第二個部分。咱們先反轉這兩部分,因而就獲得了「bagfedc",接 下來咱們再翻轉整個字符串,獲得了」cdefgab"恰好就是把原始字符串左旋轉2位的結果。test

經過分析咱們能夠寫出下面代碼:

package cglib;

public class jiekou {
    public String reverse(String str){  
        char[] arr = str.toCharArray();  
        for(int i = 0;i<(arr.length+1)/2;i++){  
            char temp = arr[i];  
            arr[i] = arr[arr.length-i-1];  
            arr[arr.length-i-1]= temp;  
        }  
        return String.valueOf(arr);  
    }  
    public void leftRotateString(String sentence,int index){  
        if(sentence == null || index >sentence.length() || index <0)  
            return;  
        
        System.out.println(sentence.substring(0, index));
        System.out.println(sentence.substring(index, sentence.length()));
        String[] splitStrings = {sentence.substring(0, index),sentence.substring(index, sentence.length())};  
        
        String resultBuffer = "";  
        for(int i =0;i<splitStrings.length;i++){
            System.out.println(splitStrings.length);
            System.out.println(splitStrings[i]);
            splitStrings[i] =reverse(splitStrings[i]);
            System.out.println("旋轉後:"+splitStrings[i]);
            resultBuffer+=splitStrings[i];  
        }  
          
        System.out.println(reverse(resultBuffer));  
    }  
    public static void main(String[] args){  
        String str= "abcdefg";  
        jiekou test = new jiekou();  
        test.leftRotateString(str, 2);  
    }  
        
        }

 

輸出:

ab cdefg 2 ab 旋轉後:ba 2 cdefg 旋轉後:gfedc cdefgab

相關文章
相關標籤/搜索