/**
* @author LemonLin
* @Description :ReverseSentence42_1
*翻轉單詞順序列
*
* 牛客最近來了一個新員工Fish,每天早晨總是會拿着一本英文雜誌,寫些句子在本子上。
* 同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。
* 例如,“student. a am I”。後來才意識到,這傢伙原來把句子單詞的順序翻轉了,
* 正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?
*
* 思路:先翻轉全部的字符串,再翻轉每個空格分割的單詞字符串。
* 本題調試bug的時候遇到很多例子無法通過:總結如下:
* 1、翻轉過程出錯:就是對應不上,代碼出錯部分,就是設置一個j的變量,j變化01234...start+j與end-j互相交換
*2、如果只有空格字符,需要返回空格,用str.trim().equals("")
* 3、如果是字符串是偶數個數(字符數組首字符下標是0),那麼翻轉的middle值爲 (start+end)/2+1;
* 爲什麼加一,如果字符數組下標是012345,則必須爲middle爲3,小於號(0+5)/2=2,加一,則爲3
* 4、需要用下標來進行翻轉,所以把輸入的字符串轉換爲字符數組,用到 str.toCharArray();
* 轉換完之後再把字符數組轉換爲字符串String.valueOf(chars);
*
* 5、需要考慮輸入的字符串沒有空格分割的時候,那麼翻轉之後還要再翻轉回來,用一個標誌位進行標記
* 6、如有空格的話,最後一個單詞由於沒有空格來做分割線,所以需要特殊翻轉最後一個
* 7、數組作爲輸入,一般情況下需要至少兩個參數,一個是數組,一個是數組長度
* @date 2018/6/12-15:29
*/
public class StringReverseSentence42_1 {
/**
* 翻轉思路是用一箇中間的變量來存,頭尾互相交換,翻轉的終止條件是到字符串的中間
*/
public String ReverseSentence(String str) {
if(str == null||str.trim().equals("")){
return str;
}
char [] chars = str.toCharArray();
//翻轉整個句子
Reverse(chars,0,chars.length-1);
//翻轉句子中的每個單詞
int j=0;
int start = j;
boolean flag = false;
while (j<chars.length){
if (chars[j]==' '){
flag = true;
int end = j-1;
j++;
Reverse(chars,start,end);
start = j;
}
j++;
}
/*5、需要考慮輸入的字符串沒有空格分割的時候,那麼翻轉之後還要再翻轉回來,用一個標誌位進行標記*/
if (flag ==false){
Reverse(chars,0,chars.length-1);
}
/* * 6、如有空格的話,最後一個單詞由於沒有空格來做分割線,所以需要特殊翻轉最後一個*/
if (flag == true){
Reverse(chars,start,chars.length-1);
}
String strChange=String.valueOf(chars);
return strChange;
}
//start 的參數爲數組開頭,end的參數爲數組的結尾;
//數組作爲輸入,一般情況下需要至少兩個參數,一個是數組,一個是數組長度
/**
* 3、如果是字符串是偶數個數(字符數組首字符下標是0),那麼翻轉的middle值爲 (start+end)/2+1;
* 爲什麼加一,如果字符數組下標是012345,則必須爲middle爲3,因爲for循環中i<middle注意體會這個小於號,
* 而不是小於等於號,小於號(0+5)/2=2,加一,則爲3*/
public void Reverse(char[] chars,int start,int end){
char temp= ' ';
int isZero = (start+end)%2;
int middle = 0;
if (isZero == 0){
middle = (start+end)/2;
}else {
middle = (start+end)/2+1;
}
int j=0;
for (int i =start;i<middle;i++){
temp = chars[start+j];
chars [start+j] = chars[end-j];
chars[end-j] = temp;
j++;
}
}
public static void main(String[] args) {
String string = "i am a student.";
StringReverseSentence42_1 stringReverseSentence42_1 = new StringReverseSentence42_1();
String s = stringReverseSentence42_1.ReverseSentence(string);
System.out.println(s);
}
}
字符串反轉句子StringReverseSentence
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.