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

例如输入“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;
}

转载于:https://www.cnblogs.com/joyclub/p/4477600.html

每天学习一点编程(2)(输入一个英文句子翻转句子单词顺序,但单词字符顺序不变 输入一个英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。为简单起见,标点符号普通字母一样处理。  例如输入“I am a student.”,则输出“student. a am I”。 阅读详情

相关推荐

解题笔记(8)——翻转句子单词顺序

问题描述:输入一个英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。为简单起见,标点符号普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。         思路:先逆转整个句子,然后从首字符

wuzhekai的专栏 4624

输入一个英文句子翻转句子单词顺序

输入一个英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。为简单起见,标点符号普通字母一样处理。 微软面试

C语言强化(九)翻转句子单词顺序

这是到很常见的题目,非常简单,但你用到数据结构了吗,或者说你用对了吗?

SexyCode 2737

c语言:入一个英文句子翻转句子中的英文单词顺序。要求单词字符顺序不变句子中的单词空格符隔开。为简单起见,标点符号普通字母一样处理。例如,若输入“I am a student.”,则输出“

单词翻转 题目输入一个英文句子翻转句子中的英文单词顺序。要求单词字符顺序不变句子中的单词空格符隔开。为简单起见,标点符号普通字母一样处理。例如,若输入“I am a student.”,则输出“student. a am I” 分析:可以用三步反转法,即用空格进行分段,分段分别反转后,全部再进行反转 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { void cha

weixin_46204060的博客 1777

输入一个英文句子翻转句子单词顺序,但单词字符顺序不变

题目:输入一个英文句子翻转句子单词顺序,但单词字符顺序不变,例如输入“I am a student”,输出“student a am I” 解题思路:定义一个字符型数组str[],内为原英文句子,定义一个字符型数组str1[],为重组后的英文句子。先求出英文句子的长度,利用for循环从元英文句子末尾向句首寻找空格符,当寻找到空格符时就将此个空格符前面一个英文单词复制到str1[]中,直

dengchuanjing的博客 7605

输入一个英文句子翻转句子单词顺序,但单词字符顺序不变

题目输入一个英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。为简单起见,没有标点符号。 例如:输入“I am a student”,则输出“student a am I” 以下是我设计的程序的源代码,自认为不是最优算法,日后还会加以研究,补上更好的算法。 #include #include #define MAX 20 int main()

qq_41658437的博客 2896

输入一个英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。为简单起见,没有标点符号。 例如输入“I am a student”,则输出“student a

#include #include int main() { char str[100]; char t; int i,j,m,n,len=strlen(str); gets(str); for(i=0,j=len-1;i { t=str[i]; str[i]=str[j]; str[j]=t; } j=0; for(i=0;i { if(str[i]=='

JeremyZJM的博客 1724

编写一个完整的应用程序:从键盘上读入一句英文(只包含英文字母、空格、半角逗号半角 句号,如:I will choose the presentation..先将该英文句子字母大写再把句子逆序输出。

思路 首先需要一个字符串,可以把字符串转换成字节数组,再通过遍历这个字节数组来给单词的首字母改成大写的方法。通过Character类判断说字母是否是字母、空格前面的条件以及toUpperCase转换成大写的方法。 紧接着通过StringBuffer 对象将转换后的英文句子装起来通过StringBuffer对象的reverse方法实现英文句子字符串的的反转。 代码: public class Practice { public static void main(String[] args) {

海海不掉头发的的博客 2600

题目输入一个英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。为简单起见,标点符号普通字母一样处理。例如输入“I am a student.”,则输出“student

转自:http://www.360doc.com/content/12/0313/16/1429048_194040867.shtml 谢谢观赏~~~

Luyouzhen的博客 4391

C++: 输入一个英文句子翻转句子单词顺序,但单词字符顺序不变

题目输入一个英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。为简单起见,标点符号普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。解题思路:方法一:先用空格将句子分割成单个单词并按顺序存储,然后将这些单词进行反转方法二:先将整个句子反转,然后再单词内部进行反转具体实现:方法一: 基本思想:先用空格将句子分割成...

growth_path_的博客 3500

每天学习一算法系列(10)(输入一句英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开)

题目输入一句英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。 为简单起见,标点符号普通字母一样处理。 例如:输入“I am a boy.”,则输出“boy. a am I”。   题目来源于:http://topic.csdn.net/u/20101011/16/2befbfd9-f3e4-41c5-bb31-814e9615832e.html

yuucyf的专栏 4819

python输入一个英文句子翻转句子单词顺序_H面试程序(4):翻转句子单词顺序 ....

题目输入一个英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。为简单起见,标点符号普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。#include#include//45minvoid swap(char *a, char *b){assert(a);assert(b);char temp;temp = *a...

weixin_39752157的博客 1477

python输入一个英文句子翻转句子单词顺序_输入一个英文句子翻转句子单词顺序单词字符顺序不变...

题目输入一个英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。为简单起见,标点符号普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。处理方法是首先将整个句子翻转,然后再将其中的每个单词翻转。代码如下:#include using namespace std;void myReverse(char*, char*...

weixin_39959615的博客 1183

翻转句子单词顺序 C语言

C语言 字符串 算法

MoXiaopeng的专栏 1万+

翻转句子单词顺序题目输入一个英文句子翻转句子单词顺序,但单词字符顺序不变

翻转句子单词顺序题目输入一个英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。为简单起见,标点符号普通字母一样处理。 例如输入“I am a student.”,则输出“student. a am I”。 void reversestr(char* str) { if (str == NULL) return; char* s = str; char* ...

weixin_42500835的博客 910

10、翻转句子单词顺序

题目输入一个英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。为简单起见,标点符号普通字母一样处理。 例如输入“I am a student.”,则输出“student. a am I”。 分析: 方法一、可以利用scanf函数以空格为分隔符的特性,按空格将字符串拆分成单词,并分别存入数组中,最后逆序输出即可。 方法二、二次颠倒字符。首先将

zwb8848happy的专栏 3582

python输入一个英文句子翻转句子单词顺序_翻转句子单词顺序

题目输入一个英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。为简单起见,标点符号普通字母一样处理。例如输入“I am a student.”,则输出“student a am I”。由于本题需要翻转句子,我们先颠倒句子中的所有字符。这时,不但翻转句子单词顺序,而且单词字符也被翻转了。我们再颠倒每个单词内的字符。由于单词内的字符翻转两次,因此顺序仍然...

weixin_39879522的博客 1338

Python反转句子单词顺序

输入一个英文句子翻转句子单词顺序,但单词字符顺序不变句子单词空格符隔开。为简单起见,标点符号普通字母一样处理。 例如:输入‘I am a student.’,则输出‘student. a am I’ 大致思路是先反转每一个单词,最后反转整个句子: 详细代码如下 def reverse(str_list,start,end): while start &lt; e...

weixin_37042783的博客 5252
上一篇: 浅析C/C++中sort函数的用法
下一篇: 旋转数组
Andy_chen1990
博客等级 码龄12年 6粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值