面试题42:反转单词顺序 VS 左旋转字符串
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。
思路:首先反转整个字符串。“I am a student.”=> “.tneduts a ma I”;
然后再反转每个单词。
void reserveStr(char *begin, char *end) {
if(begin == NULL || end == NULL)
return;
while(begin < end) {
char temp = *begin;
*begin = *end;
*end = temp;
begin ++;
end --;
}
}
char *reserveSentence(char *str) {
if(str == NULL)
return NULL;
char *begin = str;
char *end = str;
while(*end != '\0') {
end ++;
}
end --;
// 翻转整个句子的字符串
reserveStr(begin, end);
// 再把每个单词翻转回来
begin = end = str;
while(*begin != '\0') {
if(*begin == ' ') {
begin ++;
end ++;
} else if(*end == ' ' || *end == '\0') {
reserveStr(begin, --end);
begin = ++end;
} else {
end ++;
}
}
return str;
}
int main() {
// char *str = "I AM A STUDENT."; // 程序会在*pBegin = *pEnd; 处异常,
// 在这种情况下str指向的是常量字符串,
// 编译器不允许对常量字符串修改的缘故。
// cout << reserveSentence(str) << endl;
char str[] = "I AM A STUDENT.";
cout << sizeof(str) << endl;
cout << reserveSentence(str) << endl;
return 0;
}
代码还不够健壮,可以用strdup()
char *str = strdup("I AM A STUDENT.");