字串反轉

2021-06-06 14:08:41 字數 1512 閱讀 4887

解法一:第一次看到這題目,想到最簡單、最直覺的解法就是:遍歷字串,將第乙個字元和最後乙個交換,第二個和倒數第二個交換,依次迴圈,即可,於是有了第乙個解法:

const

char* str)

return tmp;

} 這裡是通過陣列的下標方式訪問字串的字元,實際上用指標直接操作即可。解法二正是基於此,實現**為:

char* strrev2(

const

char* str)

return ret;    

} 顯然上面的兩個解法中沒有考慮時間和空間的優化,乙個典型的優化策略就是兩個字元交換的演算法優化,我們可以完全不使用任何外部變數即完成兩個字元(或者整數)的交換,這也是乙個很經典的面試題目。特別是

一些嵌入式硬體相關程式設計中經常要考慮暫存器的使用,因此經常有不使用任何第三個暫存器即完成兩個暫存器資料的交換的題目。一般有兩個解法,對應這裡的解法三和解法四。

解法三的實現**為:

char* str)

return ret;

}解法四

的實現**為:

char* strrev4(const

char* str)

return ret;

}實際上我們還可以通過遞迴的思想來解決這個問題,思想很簡單:每次交換首尾兩個字元,中間部分則又變為和原來字串同樣的問題,因此可以通過遞迴的思想來解決這個問題,對應解法五的實現**為:

char* strrev5(char* str,int len)

以下給出乙個測試程式:

void p(char *a)

int main(int argc,char* argv)

你就可以看到字串"hello"和"olleh"交替輸出了。

說明:1)這裡解法中沒有認真考慮輸入字串的合法性和特殊長度(如null、乙個字元等)字串的處理;2)前4個演算法不改變輸入字串的值,解法五修改了輸入字串。

方法四中利用異或來實現兩個數的交換,這種方法是第一次見到,原理如下

以下內容摘自:

異或是一種基於二進位制的位運算,用符號xor表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。

異或運算最常見於多項式除法,不過它最重要的性質還是自反性:a xor b xor b = a,即對給定的數a,用同樣的運算因子(b)作兩次異或運算後仍得到a本身。這是乙個神奇的性質,利用這個性質,可以獲得許多有趣的應用。

例如,所有的程式教科書都會向初學者指出,要交換兩個變數的值,必須要引入乙個中間變數。但如果使用異或,就可以節約乙個變數的儲存空間:

設有a,b兩個變數,儲存的值分別為a,b,則以下三行表示式將互換他們的值

表示式 (值)

a=a xor b (a xor b)

b=b xor a (b xor a xor b = a)

a=a xor b (a xor b xor a = b)

類似地,該運算還可以應用在加密,資料傳輸,校驗等等許多領域。

字串反轉

據說一道微軟的面試題,要求考慮時間和空間的優化,下面給出幾種通常字串反轉的方法 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 方法二 不額外申請一片儲存字串的記憶體空間,通過中間變數來改變傳遞進來的字串裡...

反轉字串

問題 用o n 的演算法把 www.taobao.com 轉成 com.taobao.www 方法 用兩個棧 從左至右掃瞄字串,以點號為分隔符,每次掃瞄到點號的時候就把前面的字元壓棧到s1,然後再一直吧s1裡的東西彈棧到s2,一直彈到s1空為止 中間過程中弄幾個標記變數儲存陣列指標,最後把s2裡的東...