现在的位置: 首页 > 综合 > 正文

C\C++笔试题IV—翻转字符串

2012年09月02日 ⁄ 综合 ⁄ 共 4834字 ⁄ 字号 评论关闭

这也是笔试中一道经典的C语言题:

给定一个字符串,将其翻转。如abc ==> cba

拿到此题时,我是想都没想,直接说,再用一个字符串tmp来缓存一下此串,然后一个for循环赋值搞定。

思路有了,代码就有了。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. char string[20],tmp[20];
  6. int length;
  7. printf("please input less than 20 char:");
  8. scanf("%s",string);
  9. printf("your input string is %s\n",string);
  10. length = strlen(string);
  11. printf("length is %d\n",length);
  12. for(int i = 0;i<length;++i)
  13. {
  14. tmp[i] = string[i];
  15. }
  16. for(int i = 0;i<length;++i)
  17. {
  18. string[i] = tmp[length-i-1];
  19. }
  20. printf("after revert:%s\n",string);
  21. return 0;
  22. }

用gcc编译:gcc -o revert revert_string.c -std=c99

后运行,结果如我所料。但是我这个算法太不优雅了,因为将两个字符数组赋值就用了一个循环,然后翻转时再用一个循环,这效率真是不敢恭维。

优雅的方法应该是这样的思路:

找到这个字符串的中间位置,然后将其左边的字符与右边的字符交换位置。

实现起来应该是下面这样:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. char string[20], tmp;
  6. int length;
  7. printf("please input less than 20 char:");
  8. scanf("%s",string);
  9. printf("your input string is %s\n",string);
  10. //get string length,very useful method
  11. for(length=0;string[length];length++)
  12. ;
  13. printf("length is %d\n",length);
  14. //very beateful !!!
  15. for(int i=0;i<length/2;i++)
  16. {
  17. tmp = string[i];
  18. printf("tmp is %c\n" ,string[i]);
  19. string[i] = string[length-i-1];
  20. printf("string[%d] is %c\n",i,string[length-i-1]);
  21. string[length-i-1] = tmp;
  22. printf("string[%d] is %c\n",length-i-1,tmp);
  23. }
  24. printf("after revert:%s\n",string);
  25. return 0;
  26. }

运行效果如下:

  1. D:\workspace\C\revert_string>gcc -o revert revert_string.c -std=c99
  2. D:\workspace\C\revert_string>revert
  3. please input less than 20 char:abc
  4. your input string is abc
  5. length is 3
  6. tmp is a
  7. string[0] is c
  8. string[2] is a
  9. after revert:cba
  10. D:\workspace\C\revert_string>revert
  11. please input less than 20 char:abcd
  12. your input string is abcd
  13. length is 4
  14. tmp is a
  15. string[0] is d
  16. string[3] is a
  17. tmp is b
  18. string[1] is c
  19. string[2] is b
  20. after revert:dcba

这样的算法,相比之前要提高甚多效率。只要开动脑筋,世界会更加优雅。

 

 

 

题目如下: 写一个函数,将字符串翻转,翻转方式如下:“I am a student”反转成“student a am I”,不借助任何库函数。

方法1(自己写的) #include<stdio.h>

点击(此处)折叠或打开

  1. #include<stdlib.h>
  2. char* reserve(char* str);
  3. int get_length(char
    *str);
  4. int main(void)
  5. {
  6. char *str="I am a student";
  7. str="you are a student";
  8. char *result=reserve(str);
  9. printf("%s\n",result);
  10. free(result);
  11. result=NULL;
  12. str=NULL;
  13. return 0;
  14. }
  15. int get_length(char
    *str)
  16. {
  17. int length=-1;
  18. if(str!=NULL)
  19. {
  20. length=0;
  21. while(*str++!='\0')
  22. {
  23. length++;
  24. }
  25. }
  26. return length;
  27. }
  28. char* reserve(char* str)
  29. {
  30. int i=get_length(str);
  31. printf("%d\n",i);
  32. char* result=malloc(sizeof(char)*(i+1));
  33. if(result==NULL)
  34. {
  35. printf("%s\n","allocate string failed");
  36. exit(1);
  37. }
  38. char* temp=malloc(sizeof(char)*i);
  39. if(temp==NULL)
  40. {
  41. printf("%s\n","allocate string failed");
  42. exit(2);
  43. }
  44. char c='\0';
  45. int n=i-1;
  46. int m=0;
  47. c=*str;
  48. while(c!='\0')
  49. {
  50. if(
    ')
  51. {
  52. temp[m++]=c;
  53. }
  54. else
  55. {
  56. for(m=m-1;m>=0;m--)
  57. {
  58. result[n--]=temp[m];
  59. }
  60. result[n--]=c;
  61. m=0;
  62. }
  63. str++;
  64. c=*str;
  65. }

  66. for(m=m-1;m>=0;m--)
  67. {
  68. result[n--]=temp[m];
  69. }
  70. free(temp);
  71. temp=NULL;
  72. return result;
  73. }

方法2(从网上收集过来的)

点击(此处)折叠或打开

  1. #include
    <
    stdio.h>

  2. void main()
  3. {
  4. char str[]="you are a student";
  5. printf(str);
  6. printf("\n");

  7. char *p,*q;
  8. char temp;
  9. p=q=str;
  10. while(*q!='\0')
  11. {
  12. q++;
  13. }
  14. q--;
  15. while(p<=q)
  16. {
  17. temp=*p;
  18. *p=*q;
  19. *q=temp;
  20. p++;
  21. q--;
  22. }//反转整个字符串

  23. printf(str);
  24. printf("\n");

  25. char *s;
  26. q=p=s=str;//指针指向开始位置
  27. while(*q!='\0')
  28. {
  29. if(*q=='
    '||*(q+1)=='\0')
  30. {
  31. p--;
  32. if(*(q+1)=='\0')//处理最后一个字串
  33. p++;
  34. while(s<=p)
  35. {
  36. temp=*p;
  37. *p=*s;
  38. *s=temp;
  39. s++;
  40. p--;
  41. }//反转局部字符串

  42. s=q+1;
  43. p=q;
  44. }
  45. q++;
  46. p++;
  47. }

  48. printf(str);
  49. printf("\n");
  50. }

方法3(传说中是《程序员面试宝典》里的方法,不过我没有看过这本书,也没去验证): #include <iostram>

点击(此处)折叠或打开

  1. #include
    <
    stdio.h>

  2. int main(void)
  3. {
  4. int num=-12345,j=0,i=0,flag=0,begin,end;
  5. char str[]="I am a student",temp;
  6. j=strlen(str)-1;

  7. printf(" string=%s\n",str);
  8. //第一步是进行全盘反转,将单词变成“tneduts a ma I”
  9. while(j>i)
  10. {
  11. temp=str[i];
  12. str[i]=str[j];
  13. str[j]=temp;
  14. j--;
  15. i++;
  16. }
  17. printf(" string=%s\n",str);
  18. int i=0;
  19. //第二步进行部分反转,如果不是空格则开始反转单词
  20. while(str[i])
  21. {
  22. if(str[i]!='
    ')
  23. {
  24. begin=i;
  25. while(str[i]&&str[i]!='
    ')
  26. {
  27. i++;
  28. }
  29. i=i-1;
  30. end=i;
  31. }
  32. while(end>begin)
  33. {
  34. temp=str[begin];
  35. str[begin]=str[end];
  36. str[end]=temp;
  37. end--;
  38. begin++;
  39. }
  40. i++;
  41. }
  42. printf(" string=%s\n",str);
  43. return 0;
  44. }


抱歉!评论已关闭.