zoukankan      html  css  js  c++  java
  • 1.1一天一题:逆转字符串

    输入一个字符串,将其逆转并输出。eg:s=“abcd”,逆序后变成s=“dcba”。

    1.原地逆序

      原地逆序不允许额外分配空间,就是将字符串两边的字符逐个交换。

    (1)设置两个指针,分别指向字符串的头部和尾部,然后交换两个指针所指的字符,并向中间移动,直到交叉。(这个方法最普遍)  

     1 #include <stdio.h>
     2 
     3 char * reverse_str(char *str)
     4 {
     5     char *p,*q;
     6     p=str;
     7     q=str;
     8     while(*q)
     9         q++;
    10     q--;
    11     while(p<=q)
    12     {
    13         char a=*p;
    14         *p++=*q;
    15         *q--=a;
    16     
    17     }
    18     return str;
    19 }
    20 
    21 int main()
    22 {
    23 //  char string[]="abcdefg";
    24     char string[128]; 
    25     scanf("%s",string);
    26     printf("now: %s
    ",reverse_str(string));
    27     return 0;
    28 }

    (2)递归,调用方法 reverse_str(str,0,strlen(str)-1),对字符串 str 在区间 left 和 right 之间进行逆序。

     1 char *reverse_str(char *str,int left,int right)
     2 {
     3 
     4     if(left>=right)
     5         return str;
     6 
     7     char t=str[left];
     8     str[left]=str[right];
     9     str[right]=t;
    10     return reverse_str(str,left+1,right-1);
    11     
    12 }
    View Code

    2.普通逆序

      直接分配一个与原字符串等长的字符数组,然后反向拷贝。

    3.按单词逆序

      给定一个字符串,按单词将其逆序。eg:“This is a student”,输出是 “student a is This”。分两步,第一步,先按单词逆序,得到“sihT si a tneduts”,第二步将整个句子逆序,“student a is This”。

      对于第一步,关键是如何确定单词,这里以空格为分界。

     1 void reverse_str(char *p,char *q)
     2 {
     3     while(p<q)
     4     {
     5         char t=*p;
     6         *p++=*q;
     7         *q--=t;
     8     }
     9     
    10 }
    11 char *reverse_sen(char *sen)
    12 {
    13     char *p=sen;
    14     char *q=sen;
    15     while(*p!='')
    16     {
    17         if(*p==' ')
    18         {
    19             reverse_str(q,p-1);
    20             p++;
    21             q=p;
    22         }
    23         else
    24             p++;
    25     }
    26     reverse_str(q,p-1);
    27     reverse_str(sen,p-1);
    28     return sen;
    29 }
    30 int main()
    31 {
    32     char str[]="This is a student";    
    33 //    char string[128];
    34 //    scanf("%s",string);
    35     printf("now: %s
    ",reverse_sen(str));
    36     return 0;
    37 }

    4.逆序打印

      用递归的方式完成递归打印

    1 void reverse_print(char *str)
    2 {
    3     if(*(str+1)!='')
    4         reverse_print(str+1);
    5     printf("%c",*str);
    6 }

      

  • 相关阅读:
    Qt QString to char*
    数组和指针的异同
    QTableWidget的使用和美工总结
    static——第一次执行与它以后执行时结果不一样
    电子签名技术之疑惑
    三十六 多进程
    三十五 序列化
    vs 单元测试
    三十四 操作文件和目录
    三十三 StringIO和BytesIO
  • 原文地址:https://www.cnblogs.com/clover-siyecao/p/6140959.html
Copyright © 2011-2022 走看看