CareerCup之1.2C風格字符串翻轉
【題目】
原文:
Write code to reverse a C-Style String. (C-String means that “abcd” is represented as five characters, including the null character.)
譯文:
寫代碼翻轉一個C風格的字符串。(C風格的意思是"abcd"需要用5個字符來表示,包含末尾的 結束字符)
【分析】
這是一道經典的麵試題目,雖然看似簡單,但仍然有陷阱。唯一的陷阱就是空間複雜度為O(1)即原地置換,要特別注意null字符。
【代碼1】
/*********************************
* 日期:2014-05-05
* 作者:SJF0115
* 題目: C風格字符串翻轉
* 來源:CareerCup
**********************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
//C風格字符串翻轉
void Reverse(char *str){
if(str == NULL){
return;
}
char *beg = str;
char *end = str;
//end指向最後一個元素
while(*end){
end++;
}
//注意
--end;
char temp;
//交換
while(beg < end){
temp = *beg;
*beg = *end;
*end = temp;
end--;
beg++;
}
}
int main(){
char str[] = "1234567890";
Reverse(str);
puts(str);
return 0;
}
【代碼2】
//C風格字符串翻轉
void Reverse(char *str){
if(str == NULL){
return;
}
int len = strlen(str);
char temp;
//交換
for(int i = 0;i < len / 2;i++){
temp = str[i];
str[i] = str[len-1-i];
str[len-1-i] = temp;
}
}
【代碼3】
交換的進一步優化,使用異或進行交換:
//C風格字符串翻轉
void Reverse(char *str){
if(str == NULL){
return;
}
char *beg = str;
char *end = str;
//end指向最後一個元素
while(*end){
end++;
}
//注意
--end;
char temp;
//異或 交換
while(beg < end){
*beg = *beg^*end;
*end = *beg^*end;
*beg = *beg^*end;
end--;
beg++;
}
}
最後更新:2017-04-03 12:56:32