例如输入“I am a student.”,则输出“student. a am I”。
分析:由于编写字符串相关代码能够反映程序员的编程能力和编程习惯,与字符串相关的问题一直是程序员笔试、面试题的热门题目。本题也曾多次受到包括微软在内的大量公司的青睐。
由于本题需要翻转句子,我们先颠倒句子中的所有字符。这时,不但翻转了句子中单词的顺序,而且单词内字符也被翻转了。我们再颠倒每个单词内的字符。由于单词内的字符被翻转两次,因此顺序仍然和输入时的顺序保持一致。
还是以上面的输入为例子。翻转“I am a student.”中所有字符得到“.tneduts a ma I”,再翻转每个单词中字符的顺序得到“students. a am I”,正是符合要求的输出。
自己的代码,用的递归!
void Reverse(char arr[])
{
if (NULL == arr)
return;
char *pBegin, *pEnd;
pBegin = arr;
pEnd = arr;
while(*pEnd !=' ')
{
++pEnd;
}
--pEnd;
char temp;
while(pBegin < pEnd)
{
temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
++pBegin;
--pEnd;
}
pBegin = arr;
pEnd = arr;
for( ; *pEnd !=' '; ++pEnd)
{
if(*pEnd ==' ')
{
char *point = pEnd-1; //最好,对翻转单独形成一个函数,这样就不需要定义参数了了,按值传递嘛!!
while(pBegin < point)
{
char temp = *pBegin;
*pBegin = *point;
*point = temp;
++pBegin;
--point;
}
pBegin = pEnd+1;
}
}
--pEnd;
while(pBegin < pEnd)
{
char temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
++pBegin;
--pEnd;
}
}
#include "stdafx.h"
#include <iostream>
#include<string>
using namespace std;
void Reverse(char *pbegin,char *pend)
{
if(pbegin == pend)
return;
while(pbegin < pend)
{
char temp = *pbegin;
*pbegin = *pend;
*pend = temp;
pbegin++;
pend--;
}
}
void ReverseWord(char *pbegin,char*pend)
{
while(*pend !=' '&& *pend!=' ')
pend++;
char *pos;
pos = pend;
pend--;
Reverse(pbegin,pend);
if(*pos==' ')
return;
ReverseWord(pos+1,pos+1);
}
void main()
{
char s2[100] = "i.... am a sudent.... wei, jia zhu";
cout <<s2 <<endl;
char *pbegin , *pend;
pend = pbegin =s2;
while(*pend != ' ')
pend ++;
pend--;
Reverse(pbegin,pend);
cout <<s2<<endl;
pbegin =s2;
pend = s2;
ReverseWord(pbegin,pend);
cout <<s2;
system("pause");
}
方法2不用递归:
#include "stdafx.h"
#include <iostream>
#include<string>
using namespace std;
void Reverse(char *pbegin,char *pend)
{
if(pbegin == pend)
return;
while(pbegin < pend)
{
char temp = *pbegin;
*pbegin = *pend;
*pend = temp;
pbegin++;
pend--;
}
}
void ReverseWord(char *pbegin,char*pend)
{ int i =0;
char *pos;
pos =pend;
while(*pos !=' ')
{
while(*pend !=' '&&*pend!=' ')
pend++;
pos = pend;
pend--;
Reverse(pbegin,pend);
if(*pos==' ')
return;
pbegin =pend = pos+1;
}
}
void main()
{
char s2[100] = "i.... am a sudent.... wei, jia zhu";
cout <<s2 <<endl;
char *pbegin , *pend;
pend = pbegin =s2;
while(*pend != ' ')
pend ++;
pend--;
Reverse(pbegin,pend);
cout <<s2<<endl;
pbegin =s2;
pend = s2;
ReverseWord(pbegin,pend);
cout <<s2;
system("pause");
}
#include"stdafx.h"
#include<iostream>
using namespace std;
void swap(char *a, char *b)
{
char temp = *a;
*a = *b;
*b = temp;
}
//翻转整个句子
void Reverse(char *begin, char *end)
{
if(begin==NULL||end==NULL||begin==end)
return;
while(begin <= end)
{
swap(begin,end);
begin++;
end--;
}
}
void ReverseString(char arr[])
{
if(arr == NULL)
return;
char *pBegin = arr;
char *pEnd = arr;
while(*pEnd !=' ')
pEnd++;
pEnd--;
Reverse(pBegin,pEnd);
pBegin = arr;
pEnd = arr;
while(*pEnd !=' ')
{
while(*pEnd !=' '&& *pEnd!=' ')
pEnd++;
Reverse(pBegin, pEnd-1);
if(*pEnd !=' ')
pBegin = ++pEnd;
}
}
int main()
{
char arr[]="I Love You my friend";
ReverseString(arr);
cout<<arr;
system("pause");
return 0;
}