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


    例如输入“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;
    }
  • 相关阅读:
    JAVA学习日报 12/15
    JAVA学习日报 12/14
    JAVA学习日报 12/13
    如何在idea上配置meaven和tomcat!(idea2020)
    关于win10共存多个版本jdk,并如何进行最简单的切换
    Java面试知识点
    一些基本html标签的使用案例
    线性代数复习笔记
    考前加分项
    Javaweb学习12.18
  • 原文地址:https://www.cnblogs.com/joyclub/p/4477600.html
Copyright © 2020-2023  润新知