劍指Offer面試題42:翻轉單詞順序;左旋轉字串 Java實現
阿新 • • 發佈:2019-02-20
/************************************************************** * 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)); } }