题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。

例如输入“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 !='\0')
{
++pEnd;
}
--pEnd;
char temp;
while(pBegin < pEnd)
{
temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
++pBegin;
--pEnd;
}
pBegin = arr;
pEnd = arr;
    for( ; *pEnd !='\0'; ++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!='\0')
      pend++;
      char *pos;
      pos = pend;
      pend--;
    Reverse(pbegin,pend);
    if(*pos=='\0')
        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 != '\0')
      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 !='\0')
    {
    while(*pend !=' '&&*pend!='\0')
      pend++;
      pos = pend;
      pend--;
    Reverse(pbegin,pend);
    if(*pos=='\0')
        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 != '\0')
      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 !='\0')
        pEnd++;
    pEnd--;
    Reverse(pBegin,pEnd);
    pBegin = arr;
    pEnd = arr;
    while(*pEnd !='\0')
    {
        while(*pEnd !=' '&& *pEnd!='\0')
            pEnd++;
        Reverse(pBegin, pEnd-1);
        if(*pEnd !='\0')
        pBegin = ++pEnd;
    }

}

int main()
{
    char arr[]="I Love You my friend";
    ReverseString(arr);
    cout<<arr;
    system("pause");
    return 0;
}
posted @ 2015-05-04 21:34  码农@163  阅读(1940)  评论(0编辑  收藏  举报