基本上沒有這麼考的,放在這裡主要是為了和後面的原地逆序做個對比。很簡單,直接分配乙個與原字串等長的字元陣列,然後反向拷貝一下即可。
char* reverse(char* s)原地逆序
英文叫做in-place reverse。這是最常考的,原地逆序意味著不允額外分配空間,主要有以下幾種方法,思想都差不多,就是將字串兩邊的字元逐個交換,如下圖。給定字串"abcdef",逆序的過程分別是交換字元a和f,交換字元b和e,交換字元c和d。
一 設定兩個指標,分別指向字串的頭部和尾部,然後交換兩個指標所指的字元,並向中間移動指標直到交叉。
char* reverse(char* s)二 用遞迴的方式,需要給定逆序的區間,呼叫方法:reverse(s, 0, strlen(s)) ;return
s ;}
//三 非遞迴法,同樣指定逆序區間,和方法一沒有本質區別,乙個使用指標,乙個使用下標。對字串s在區間left和right之間進行逆序,遞迴法
void reverse( char* s, int left, int
right )
//對字串str在區間left和right之間進行逆序
char* reverse( char* s, int left, int
right )
return
s ;}
//給定乙個字串,按單詞將該字串逆序,比如給定"this is a sentence",則輸出是"sentence a is this",為了簡化問題,字串中不包含標點符號。使用異或操作對字串s進行逆序
char* reverse(char*s)
return
r ;}
分兩步1 先按單詞逆序得到"siht si a ecnetnes"
2 再整個句子逆序得到"sentence a is this"
對於步驟一,關鍵是如何確定單詞,這裡以空格為單詞的分界。當找到乙個單詞後,就可以使用上面講過的方法將這個單詞進行逆序,當所有的單詞都逆序以後,將整個句子看做乙個整體(即乙個大的包含空格的單詞)再逆序一次即可,如下圖所示,第一行是原始字元換,第二行是按單詞逆序後的字串,最後一行是按整個句子逆序後的字串。
對指標p和q之間的所有字元逆序
void reverseword(char* p, char*q)}//
將句子按單詞逆序
char* reversesentence(char* s)
else
q++;
}reverseword(p, q - 1) ; //
對最後乙個單詞逆序
reverseword(s, q - 1) ; //
對整個句子逆序
return
s ;}
還有一類題目是要求逆序輸出,而不要求真正的逆序儲存。這題很簡單,有下面幾種方法,有的方法效率不高,這裡僅是提供乙個思路而已。
先求出字串長度,然後反向遍歷即可。
void
reverseprint(
const
char*s)
如果不想求字串的長度,可以先遍歷到末尾,然後在遍歷回來,這要借助字串的結束符'\0
void reverseprint(const char*s)對於上面第二種方法,也可以使用遞迴的方式完成。}
void
reverseprint(
const
char*s)
字串 字串逆序
題目一 如果乙個字串 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...