• H面试程序(4):翻转句子中单词的顺序 .


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

    #include<stdio.h>
    #include<assert.h>
    //45min
    void swap(char *a, char *b)
    {
    	assert(a);
    	assert(b);
    	char temp;
    	temp = *a;
    	*a = *b;
    	*b = temp;
    }
    
    void reverse(char * str,int  start,int end)
    {   
    	assert(str);
    
    	int j = (end-start)/2;
    
    	for(int i =0; i<=j; i++)
    		swap(&(str[start++]), &(str[end--]));
    }
    
    void ReverceSentence(char * Str)
    {
    	  assert(Str);
    	  int i = 0;
    	  while(Str[i] !='')
    	  {
    		  i++;
    	  }
    	  int strlen = i; //得到字符串的长度
    
    	  //整个字符串进行翻转
    	  reverse(Str,0,strlen-1);
    
    	  //每个单词进行翻转
    
    	  int j ;
    	  for(j = 0; j < strlen-1; j++)  //最后一个那个''不用管它
    	  {
               int start = j;//每个单词的起始位置
    		   int end = j;  //每个单词介绍的位置,初始化为j(新单词起始的位置)
    		   while(Str[j] != ' '&&Str[j] != '' )  //遇到空格或结束符的时候退出,否则继续判断
    		   {
    			   end++;  
    			   j++;
    		   }		  	   
    		   reverse(Str,start, end-1);  //对单个字符进行翻转	  
    	  }       
    }
    
    int main()
    {
        char sentence[]="I am a student!";  
        ReverceSentence(sentence); 
    	printf("%s",sentence);
    	printf("
    ");
    	return 0;
    }


     

    网上参考答案

    #include <iostream>
    using namespace std;
    
    void Reverse(char *start,char *end) //翻转字符串
    {
         if(start==NULL||end==NULL)
            return;
        
         char temp;
         while(start<end)
         {
                temp=*start;
                *start=*end;
                *end=temp;
                start++;
                end--;        
         }
    }
    
    char *ReverceSentence(char *pstr)
    {
        if(pstr==NULL)
           return NULL;
        
         //先将整个句子翻转
         char *start=pstr;
         char *end=pstr+strlen(pstr)-1;
         Reverse(start,end);
        
         start=pstr;
         end=pstr;
        
         //取出一个个单词,翻转之
         while(*start!='')
         {
           if(*start==' ')   //单词起始至非空格字符
              {
                start++;
                end++;
                continue;       
              }
           else if(*end==' '||*end=='')    //结束至空格或结束符前一个字符
           {
                Reverse(start,--end);
                start=++end;
           } 
           else
             end++; 
         }
         return pstr;
    }
    int main()
    {
          char sentence[]="I am a student!";
          char *reverced=ReverceSentence(sentence);
          cout<<reverced<<endl;
          system("pause");
          return 0;
    }


     

    /*把给定的字符串的begin到end之间的部分翻转*/
    void _reverse(char *str, int begin, int end)
    {
     int i = 0;
     while(i <= (end - begin) / 2)
     {
      swap(str[begin + i], str[end - i]);
      ++i;
     }
    }


     

  • 相关阅读:
    Visual Studio 调试系列3 断点
    mysql客户端(Navicat)远程登录操作遇到问题1142
    php Socket通信
    centos crontab(定时任务) 使用
    nginx中配置pathinfo模式示例
    IE9总是弹出“ICBC Anti-Phishing class” 加载项是否要启用还是不启用的提示
    windows 2008 R2 断电重启进入修复模式
    unserialize() [function.unserialize]: Error at offset
    解决子级用css float浮动 而父级div没高度不能自适应高度
    php追加编译GD库
  • 原文地址:https://www.cnblogs.com/riskyer/p/3315233.html
Copyright © 2020-2023  润新知