★颠倒一个字符串。优化速度。优化空间。
void reverse(char *str) {
reverseFixlen(str, strlen(str));
}
void reverseFixlen(char *str, int n) {
char* p = str+n-1;
while (str < p) {
char c = *str;
*str = *p; *p=c;
}
void reverse(char *str) {
reverseFixlen(str, strlen(str));
}
void reverseFixlen(char *str, int n) {
char* p = str+n-1;
while (str < p) {
char c = *str;
*str = *p; *p=c;
}
}
这里先给出一个颠倒一个字符串的例子,因为颠倒一句话的词的顺序,相当于颠倒两次,第一次将整个字符串翻转,第二次将每个单词翻转,例如把字符串“I am a student”反转成为“tneduts a ma I”,不借助任何库函数,以及把整个字符串逆序,每个单词串要再次翻。
接下来是总的程序:
★颠倒一个句子中的词的顺序
void reverseWordsInSentence(char * str) {
int len = strlen(str);
reverseFixlen(str, len);//这里用到了上面的函数,这里现将整几句话颠倒
char * p = str;
while (*p!=’\0’) {
while (*p == ‘ ‘ && *p!=’\0’) p++;
str = p;
while (p!= ‘ ‘ && *p!=’\0’) p++;
reverseFixlen(str, p-str);//这里将每句话里的已经颠倒的词再次颠倒,即为正确的词。
}
}
接下来给出一个可以使用的完整的C++程序:
#include <cstdlib>
#include <iostream>
using namespace std;
void ReverseStr(char *begin, char *end)
{
//reverse the whole string
while(begin < end)
{
char temp = *begin;
*begin = *end;
*end = temp;
begin++;
end--;
}
}
void Reverse(char *str)
{
//reverse the whole string
size_t len = strlen(str);
ReverseStr(str, str + len - 1);
//reverse every word
char *p1 = str;
char *p2 = str;
while(*p2 != '\0')
{
while(*p2 != '\0' && *p2 != ' ')
p2++;
ReverseStr(p1, p2 - 1);
while(*p2 == ' ')
p2++;
p1 = p2;
}
}
int main(int argc, char *argv[])
{
char str[] = "I am a student.";
Reverse(str);
cout<<str<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
这个例子同上个例子的算法都是一样的。