1. 程式人生 > >劍指Offer面試題42:翻轉單詞順序;左旋轉字串 Java實現

劍指Offer面試題42:翻轉單詞順序;左旋轉字串 Java實現

/**************************************************************      
* Copyright (c) 2016, 
* All rights reserved.                   
* 版 本 號:v1.0                   
* 題目描述:翻轉單詞順序
*		        輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字串的順序不變。例如輸入字串:“I am a student”,則輸出“student a am I”
* 輸入描述:請輸入一個英語字串:
*			I am a good student  .
* 程式輸出:演算法1翻轉後的輸出是:
*			reverse後的順序為:
*			.  tneduts doog a ma I
*			.  student good a am I
*			一行程式碼翻轉後的輸出是:
*			.  student good a am I
*			演算法2翻轉後的輸出是:
*			.  student good a am I
* 問題分析: 無
* 演算法描述:	 第一步:旋轉句子中的所有字元,比如翻轉I am a student中所有單詞得到:“tneduts a ma I”。
* 			此時不但翻轉了句子中單詞的順序,就連單詞內字元順序也翻轉了。
*        	第二步:再次翻轉每個單詞的順序,這樣就得到了”student a am I“
* 完成日期:2016-09-25
***************************************************************/

package org.marsguo.offerproject42;

import java.util.Scanner;

class SolutionMethod1{
	public void reverse(char[] data,int start,int end){
		if(data == null || data.length < 1 || start < 0 ||
				end > data.length || start > end)
			return;
		/*
		while迴圈直接將整個句子的所有單詞順序翻轉
		*/
		while (start < end){
			char temp = data[start];
			data[start] = data[end];
			data[end] = temp;
			
			start++;
			end--;
		}
	}
	public char[] reverseSentence(char[] data){
		if(data == null || data.length < 1)
			return data;
		
		reverse(data,0,data.length - 1);
		
		System.out.println("reverse後的順序為:");
		for(int j = 0;j <data.length;j++)
			System.out.print(data[j]);
		System.out.println();
		
		int start = 0;			//start用於尋找每個單詞的開頭
		int end = 0;			//end用於尋找每個單詞後面的空格
		
		while(start < data.length){
			if(data[start] == ' '){
				start++;
				end++;
			}
			else if(end == data.length || data[end] == ' '){		//判斷end是否找到了句子的開頭或者是否到了句子的結尾
				reverse(data,start,end - 1);			//找到空格後,將空格前面的單詞翻轉,這樣單詞的順序就對了
				end++;									//end繼續向後移動
				start = end;							//把空格處賦給start,讓start重新指向下一個單詞的開始
			}
			else{
				end++;
			}
		}
		return data;			//返回的data即為最後旋轉後的結果
	}
	/*
	使用遞迴,直接將傳入的字串翻轉
	*/
	public String ReverSentence(String str) {
        return (str.lastIndexOf(" ")==-1)?str:str.substring(str.lastIndexOf(" ")+1) +" "+ReverSentence(str.substring(0,str.lastIndexOf(" ")));
    }
}

class SolutionMethod2{
	public String ReverseMethod2Fun(String str){
		StringBuffer stringbuffer = new StringBuffer("");
		if(str.length() <= 0 || str.trim().equals("")){
			return str;
		}
		String[] strSet = str.split(" ");
		int length = strSet.length;
		for(int i = length - 1; i > 0;i--){
			stringbuffer.append(strSet[i] + " ");
			
		}
		stringbuffer.append(strSet[0]);
		return stringbuffer.toString();
	}
}

public class ReverseString {
	public static void main(String[] args){
		Scanner scanner = new Scanner(System.in);
		System.out.println("請輸入一個英語字串:");
		String str = scanner.nextLine();
		scanner.close();
		
		char[] data = new char[str.length()];
		data = str.toCharArray();
		SolutionMethod1 solution1 = new SolutionMethod1();
		System.out.println("演算法1翻轉後的輸出是:"); 
		System.out.println(solution1.reverseSentence(data));
		System.out.println("一行程式碼翻轉後的輸出是:");
		System.out.println(solution1.ReverSentence(str));
		
		SolutionMethod2 solution2 = new SolutionMethod2();
		System.out.println("演算法2翻轉後的輸出是:"); 
		System.out.println(solution2.ReverseMethod2Fun(str));
		
		
	}
}