方法一:
// 程序员面试100题(算法)之翻转句子中单词的顺序 #include "stdafx.h" #include<iostream> using namespace std; void reverse(char* begin, char* end) { if ((begin == NULL) || (end == NULL)) return ; char temp; while (begin < end) { temp = *begin; *begin = *end; *end = temp; ++begin; --end; } } char *reverseSentence(char *pData) { if(NULL == pData) return NULL; char *begin = pData; char *end = pData; while(*end != '\0') { end++; } end--; //reverse the overall sentence reverse(begin, end); //reverse each word in the reversed sentence begin = pData; end = pData; while(*begin != '\0') { if(*begin == ' ') { begin++; end++; continue; } if(*end == ' ' || *end == '\0') { end--; reverse(begin, end); end++; begin = end; } else { end++; } } return pData; } int _tmain(int argc, _TCHAR* argv[]) { char sentence[] = "I am in China today!! I am very happy!!!!"; char *newSentence = NULL; newSentence = reverseSentence(sentence); cout << newSentence << endl; return 0; }
方法二:(用异或实现反转)
#include "stdafx.h" #include <iostream> #include <cstring> using namespace std; void Reverse(char* b, char* e) { if ((b == NULL) || (e == NULL)) return ; while (b < e) { *b ^= *e; *e ^= *b; *b ^= *e; ++b; --e; } } void WordReverse(char* s) { if (s == NULL) return; Reverse(s, s + strlen(s) - 1); char* b = s; char* e = s; while(*e) { if (*e == ' ') { Reverse(b, e - 1); ++e; b = e; } else ++e; } Reverse(b, e - 1); } int _tmain(int argc, _TCHAR* argv[]) { char my[] = "I am a student"; Reverse(my, my + strlen(my) - 1); cout << my << endl; char my2[] = "I am a student "; WordReverse(my2); cout << my2 << endl; return 0; }
附:
1、递归逆置字符串
char *recurReverse(char* s, int left, int right) { if(left >= right) return s; char c = s[left]; s[left] = s[right]; s[right] = c; recurReverse(s, left + 1, right - 1); }
2、普通的字符串逆置,申请新的空间,然后逆序复制过去。
char *commonReverse(char* s) { if(NULL == s) { return NULL; } char *end = s; while(*end != '\0') { end++; } end--; char *newStr = (char*)malloc(sizeof(char) * (strlen(s) + 1)); char *str = newStr; while(end != s) { *newStr = *end; end--; newStr++; } *newStr = *end; *(++newStr) = '\0'; return str; }