您的位置:首页 > 职场人生

程序员面试100题(算法)之翻转句子中单词的顺序

2012-08-14 19:58 405 查看
方法一:

// 程序员面试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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: