Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1006672
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: C/C++

2012-10-03 10:48:30

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

这个题比较常见。写了一个自以为比较简练的实现。这个实现主要是就地反转。
这里需要注意的是因为是就地反转,那么这个字符串必须是个变量(char i[] = "abcd",不能使用常量声明(形如 char * i= "abcd").
1.首先将这个句子反转。
2.以空格为分界,以单词为单位反转。

另外一个是利用两个栈,word栈存储单词,sentence存储句子
如果读到的不是空格,说明正在处理单词,那么入word栈。
如果读到的是空格或者'\0',那么说明单词终结,吧word中内容一一出栈再压入sentence。这就相当与在sentence栈中,保持了单词正序。接着再将空格压入sentence.
当所有字符串处理完毕后,将sentence出栈构建一个字符串。
结果就是反转后的结果。
这个题很可惜,本来应该一次过,结果最后出栈的时候本来应该是sentence--写成++, 可惜。另外头一次编译也忘记了释放两个栈的内存。

点击(此处)折叠或打开

  1. /*
  2.  * =====================================================================================
  3.  *
  4.  * Filename: revwords.c
  5.  *
  6.  * Description:
  7.  *
  8.  * Version: 1.0
  9.  * Created: 10/03/2012 09:31:26 AM
  10.  * Revision: none
  11.  * Compiler: gcc
  12.  *
  13.  * Author: YOUR NAME (),
  14.  * Organization:
  15.  *
  16.  * =====================================================================================
  17.  */
  18. #include <stdlib.h>
  19. #include <stdio.h>



  20. char* revwords(char* input, int len){
  21.     char *head = input;
  22.     char *tail = input + len -1;
  23.     while(head<tail){
  24.         //swap here
  25.         *head ^=*tail;
  26.         *tail ^=*head;
  27.         *head ^=*tail;
  28.         head++;
  29.         tail--;
  30.     }
  31.     return input;
  32. }

  33. char* revsentence(const char* input, int len){
  34.     char * sen = (char*)malloc(sizeof(char)*len + 1);
  35.     char * word = (char*)malloc(sizeof(char)*len + 1);
  36.     *sen = '\0';
  37.     *word = '\0';
  38.     while(1){
  39.         if(*input == ' ' || *input == '\0'){
  40.             //word --> sen
  41.             while(*word){
  42.                 sen++;
  43.                 *sen = *word;
  44.                 word --;
  45.             }
  46.             if(*input == ' '){
  47.                 sen++;
  48.                 *sen = *input;
  49.             }
  50.             else if(*input == '\0') break;
  51.         }
  52.         else{
  53.             word++;
  54.             *word = *input;
  55.         }
  56.         input++;
  57.         
  58.     }
  59.     char *result = (char*) malloc(sizeof(char) * (len + 1));
  60.     int i = 0;
  61.     for(;i<len+1; i++){
  62.         result[i] = *sen;
  63.         sen--;
  64.     }
  65.     free(sen);
  66.     free(word);
  67.     return result;
  68. }

  69. /*
  70.  * === FUNCTION ======================================================================
  71.  * Name: main
  72.  * Description:
  73.  * =====================================================================================
  74.  */
  75.     int
  76. main ( int argc, char *argv[] )
  77. {
  78.     char str[] = "I am here!";
  79.     revwords(str, sizeof(str)-1);
  80.     char *head= str;
  81.     int len = 0;
  82.     while(*head){
  83.         if(*head != ' ') len++;
  84.         if(*head == ' ' && len>0){
  85.             revwords(head-len, len);
  86.             len = 0;
  87.         }
  88.         head++;
  89.     }
  90.     printf ( "result = %s\n",str );
  91.     printf ( "-----------using stack--------------\n" );
  92.     printf ( "%s\n", revsentence("Here I am!",sizeof("Here I am!")-1 ));

  93.     return EXIT_SUCCESS;
  94. }                /* ---------- end of function main ---------- */

阅读(4219) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~