字串逆序可以說是最經常考的題目。這是一道入門級的題目。給定乙個字串s,將s中的字元順序顛倒過來,比如s="abcd",逆序後變成s="dcba"。
基本上沒有這麼考的,放在這裡主要是為了和後面的原地逆序做個對比。很簡單,直接分配乙個與原字串等長的字元陣列,然後反向拷貝一下即可。
char* reverse(char* s)
原地逆序
英文叫做in-place reverse。這是最常考的,原地逆序意味著不允額外分配空間,主要有以下幾種方法,思想都差不多,就是將字串兩邊的字元逐個交換,如下圖。給定字串"abcdef",逆序的過程分別是交換字元a和f,交換字元b和e,交換字元c和d。
一 設定兩個指標,分別指向字串的頭部和尾部,然後交換兩個指標所指的字元,並向中間移動指標直到交叉。
char* reverse(char* s)
return s ;
}
二 用遞迴的方式,需要給定逆序的區間,呼叫方法:reverse(s, 0, strlen(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 ;
}
// 使用異或操作對字串s進行逆序
char* reverse(char* s)
return r ;
}
給定乙個字串,按單詞將該字串逆序,比如給定"this is a sentence",則輸出是"sentence a is this",為了簡化問題,字串中不包含標點符號。
分兩步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)
面試題 字串翻轉
使用 c c 編寫函式,實現字串反轉,要求不使用任何系統函式,且時間複雜度最小,函式原型 char reverse str char str 使用c c 編寫函式,實現字串反轉,要求不使用任何系統函式,且時間複雜度最小,函式原型 char reverse str char str include i...
字串處理面試題 字串包含問題
為了準備面試中出現的字串問題,我決定做乙個系列,以我自己的標準,將自己認為比較優秀的字串面試題整理一些。希望這樣做能夠形成解決字串問題的一般思路,能夠比較高效地解決字串問題。這個問題是看了 感謝 v july v 問題描述 有兩個任意字串sting a,sting b,實現如下函式 int cont...
面試題 字串轉位元組
這是遇到的面試題,請問i j 為什麼?string str1 abcd測試一下 var strtobytes1 system.text.encoding.utf8.getbytes str1 var i strtobytes1.length var j str1.length 答 i 16 j 8 ...