字串反轉問題

2021-08-15 03:24:08 字數 1481 閱讀 9985

牛客最近來了乙個新員工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 方法二 不額外申請一片儲存字串的記憶體空間,通過中間變數來改變傳遞進來的字串裡...