牛客最近來了乙個新員工fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事cat對fish寫的內容頗感興趣,有一天他向fish借來翻看,但卻讀不懂它的意思。例如,「student. a am i」。後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是「i am a student.」。cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?主要思路是,先整個反轉字串陣列,然後逐個反轉單詞。
劍指offer使用的是指標,我這裡使用的是int下標來指示的,原理都一樣。不過在這裡有一些下標指向問題需要格外小心,**注釋中已經詳細給出。
void
reverse(char *str, int begin, int end)
}string reversesentence(char *strarr)
// index指向最後乙個有效字元,index是長度,不包括'\0',index--就變成了最後乙個有效字元
index--;
reverse(strarr, 0, index);
int pbegin = 0;
int pend = 0;
while(strarr[pbegin] != '\0')
else
if(strarr[pend] == ' ' || strarr[pend] == '\0') // 單詞結束標誌,翻轉
else
pend++; // pend向後遍歷
}}
還有另外乙個問題
組合語言中有一種移位指令叫做迴圈左移(rol),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於乙個給定的字串行s,請你把其迴圈左移k位後的序列輸出。例如,字串行s=」abcxyzdef」,要求輸出迴圈左移3位後的結果,即「xyzdefabc」。是不是很簡單?ok,搞定它!思路和上面類似,不過順序不同,這次我們現實按照分割k為前後翻轉兩個子串,然後再翻轉整個字串。
void leftrotatestring(char *str, int n)
int len = index;
if(n >= len)
return;
int startfirst = 0;
int endfirst = n-1;
int startsecond = n;
int endsecond = len-1;
reverse(str, startfirst, endfirst);
reverse(str, startsecond, endsecond);
reverse(str, startfirst, endsecond);
}
總結一下
字串翻轉可以通過首尾字元交換實現。
涉及到字串移位的問題,可以嘗試通過多次翻轉實現,翻轉子串和全字串順序要考慮清楚。
字串反轉的問題
1.常見面試題 將字串 i am a student.翻轉為 student.a am i 此題看著簡單,但是很有可能會出現如下錯誤 public class reversetest 這樣用stringbuffer或者stringbuilder的reverse 方法會讓每個單詞的字母順序都改變了,以...
字串反轉
據說一道微軟的面試題,要求考慮時間和空間的優化,下面給出幾種通常字串反轉的方法 1 直接陣列操作 char strreverse char str return str 這種做法原來的str沒有儲存,原來的str也改變了 2 指標操作 char strreverse char str return ...
字串反轉
include include include 方法一 將第乙個字元和最後乙個互換,第二個和倒數第二個互換,如此依次迴圈下去 char strrev1 const char str return tmp free tmp 方法二 不額外申請一片儲存字串的記憶體空間,通過中間變數來改變傳遞進來的字串裡...