題意
題目描述
牛客最近來了一個新員工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--;
}
}
}