字串逆序(一)

2021-07-13 16:10:51 字數 3128 閱讀 9318

一、普通的字串逆序

例如,給定乙個字串 s,將 s 中的字元順序顛倒過來,如 s = 「abcd」,逆序後變成 「dcba」。可以採用多種方法對字串進行逆序,以下將對其中的一些方法進行分析。

(1)直接分配乙個與原字串等長的字元陣列,然後反向拷貝即可。

具體實現如下:

#include 

char *reverse(char *s)

int main(int argc, const

char * argv)

注意點:

<1> new char[10]; 分配一塊連續的記憶體,即乙個陣列,裡面有10個元素。

<2> new char(10); 分配一塊記憶體,有乙個元素,該元素被初始化為10。

(2)原地逆序

原地逆序不允許額外分配空間,就是將字串兩邊的字元逐個交換。例如,給定字串 「abcd」,逆序的過程分別是交換字元a和d,交換字元b和c。如果最中間有兩個字元(即需要反轉的字串長度為偶數),那就交換;如果最中間有乙個字元(即需要反轉的字串長度為奇數),那就不需要碰它。還有就是最後乙個用來標識字串結尾的0x00字元不用動它。

實現方式有以下幾種:

1)設定兩個指標,分別指向字串的頭部和尾部,然後交換兩個指標所指的字元,並向中間移動指標直到交叉。

具體實現如下:

#include 

char *reverse(char *s) // 該函式應有返回值,或者建議使用引用型形參。

returns;}

int main(int argc, const char * argv)

2)遞迴:思想很簡單,每次交換首尾兩個字元,中間部分則又變為和原來字串同樣的問題,因此可以通過遞迴的思想來解決這個問題;需要給定逆序的空間,呼叫方法reverse( s, 0, strlen(s) - 1 ),對字串 s 在區間 left 和 right 之間進行逆序。

具體實現如下:

#include 

char *reverse(char *s, int left, int right)

int main(int argc, const

char * argv)

// 如果想用遞迴方法,反轉字串常量,需要做如下修改。

int main(int argc, const

char * argv)

char *s = reverse(str, 0, (int)strlen(str)-1);

printf("%s\n", s);

return

0;}

3)非遞迴,同樣指定逆序區間,和方法 1)沒有本質區別,乙個使用指標,乙個使用下標。

具體實現如下:

#include 

char *reverse(char *s, int left, int right)

return s;

}int main(int argc, const

char * argv)

(3)不允許使用臨時變數的原地逆序

原地逆序雖然沒有額外分配空間,但還是使用了臨時變數,占用了額外的空間。如果不允許使用額外空間,主要有以下幾種實現方法。

1)利用異或操作,實現兩個變數的交換(按位異或)

#include 

char *reverse(char *s)

returns;}

int main(int argc, const char * argv)

2)利用加減法,實現兩個變數的交換

#include 

char *reverse(char *s)

returns;}

int main(int argc, const char * argv)

3)使用字串的結束字元 『\0』 所在的位置作為交換空間,但這個有侷限,只適合以 『\0』 結尾的字串,對於不支援這種字串格式的語言,就不能使用了。

#include 

char *reverse(char *s)

*q = '\0';

returns;}

int main(int argc, const char * argv)

小記:

交換2個數,常用的方法:

如:tmp=a;a=b;b=tmp;

這種方法需要借助第三變數來實現;

<2> 第二種方法是利用加減法實現兩個變數的交換,

如:a=a+b;b=a-b;a=a-b;

但是 如果 a+b 超出 a的範圍,就會出錯!極為不推薦 此方法

<3> 第三種方法是得用位異或運算來實現,也是效率最高的一種,在大量資料交換的時候,效率明顯優於前兩種方法,

如:a=a^b;b=a^b;a=a^b;

原理:利用乙個數異或本身等於0和異或運算符合交換率。

異或運算的性質:

1.任意乙個變數x與其自身進行異或運算,結果為0,即x^x=0

2.任意乙個變數x與0進行異或運算,結果不變,即x^0=x

3.異或運算具有可結合性,即a^b^c=(a^b)^c=a^(b^c)

4.異或運算具有可交換性,即a^b=b^a

分析:

第一步: a = a ^ b;

完成後 a變數的結果為a ^ b

第二步: b = a ^ b;

此時賦值號右邊的a儲存的是a ^ b的值,那麼將賦值號右邊的a用a ^ b替換,

得到(a ^ b) ^ b=a ^ (b ^ b)=a ^0=a,

即經過第二步運算後b中的值為a,即b=a,將a換到了b裡

第三步: a = a ^ b;

此時賦值號右邊的a儲存的仍然是a ^ b的值,不變,而賦值號右邊的b已經是a 了,

將賦值號右邊的a,b分別進行替換,

即此時賦值號右邊a ^ b=(a ^ b)^ a=a ^ b^ a=a ^ a^ b=0^ b=b, 該值賦值給a,即a=b

即經過第三步運算後a中的值為b,即a=b,將b換到了a裡

這樣經過如上的三步驟,完成了交換兩個變數a,b而無需借助第3個臨時變數過程。

字串 字串逆序

題目一 如果乙個字串 str 把字串 str 前面的任意部分挪到後面去形成的字串叫做 str 的旋轉詞。比如 str 1234 那麼 str 的旋轉詞有 1234 2341 3412 4123 給定兩個字串 a 和 b 請判斷 a 和 b 是否互為旋轉詞?舉例 a cdab b abcd 返回 tr...

字串逆序

1 方法1 protected void page load object sender,eventargs e 1.逆序乙個字串 public string reversestr return s1 2 方法2 public void reversestr 方法3 protected void p...

字串逆序

reverse int arr,int b,int e rightshift int arr,int n,int k abc defg defg abc 方法一 翻轉 abc defg cba gfed cba gfed defg abc經過三次翻轉 如上。方法二 交換加翻轉 abc defgh d...