zoukankan      html  css  js  c++  java
  • 如何将字符串逆序

    方法一:普通逆序。直接分配一个与愿字符串登场的字符数组,然后反向拷贝即可。

    代码如下:

    #include "stdafx.h"
    #include <stdio.h>
    char *Reverse(char *s)
    {
        char *q = s;
        while (*q)q++;
        q=q-1;
        char *p = new char[sizeof(char)*(q - s + 2)];
        char *r = p;
        //逆序存储
        while (q >= s)
        {
            *p = *q;
            p++;
            q--;
        }
        *p = '';
        return r;
    }
    int main()
    {
        char a[] = "abcd";
        int len = sizeof(a) / sizeof(a[0]);
        printf("%s
    ", Reverse(a));
        getchar();
        return 0;
    }

    方法二:双指针原地逆序。设置两个指针,分别指向字符串的头部和尾部,然后交换两个指针所指的字符,并向中间移动指针直到交叉。

    代码如下:

    #include "stdafx.h"
    #include <stdio.h>
    char *Reverse(char *s)
    {
        char *p = s;
        char *q = s;
        while (*q) q++;
        q--;
        while (q > p)
        {
            char t = *p;
            *p = *q;
            p++;
            *q = t;
            q--;
        }
        return s;
    }
    int main()
    {
        char a[] = "abcd";
        printf("%s
    ", Reverse(a));
        getchar();
        return 0;
    }

    方法三:递归原地逆序。指定逆序区间,借用一个中间变量,每次将首尾字符互换。

    代码如下:

    #include "stdafx.h"
    #include <stdio.h>
    char *Reverse(char *s, int left, int right)
    {
        if (left >= right)
            return s;
        char t = s[left];
        s[left] = s[right];
        s[right] = t;
        Reverse(s, left + 1, right - 1);
    }
    int main()
    {
        char a[] = "abcd";
        printf("%s
    ", Reverse(a,0,3));
        getchar();
        return 0;
    }

    方法四:非递归原地逆序。指定逆序区间,使用while循环从两头开始不断交换首尾字符,直到全部交换完毕。

        代码如下:

    #include "stdafx.h"
    #include <stdio.h>
    char *Reverse(char *s, int left, int right)
    {
        while (left < right)
        {
            char t = s[left];
            s[left] = s[right];
            left++;
            s[right] = t;
            right--;
        }
        return s;
    }
    int main()
    {
        char a[] = "abcd";
        printf("%s
    ", Reverse(a, 0, 3));
        getchar();
        return 0;
    }

    方法五:异或原地逆序。先将要交换的两个变量异或,结果保存在其中一个变量中。然后与另一个变量异或并将结果赋值给该变量,再与该变量异或并将结果赋值给另一个变量。

    代码如下:

    #include "stdafx.h"
    
    #include <stdio.h>
    
    char* Reverse(char* s)
    
    {
    
    char* r = s;
    
    char* p = s;
    
    while (*(p + 1) != '') ++p;
    
    while (p > s)
    
    {
    
    *p = *p^*s;
    
    *s = *p^*s;
    
    *p = *p^*s;
    
    s++;
    
    p--;
    
    }
    
    return r;
    
    }
    
    int main()
    
    {
    
    char a[] = "abcd";
    
    int len = sizeof(a) / sizeof(a[0]);
    
    printf("%s
    ", Reverse(a));
    
    getchar();
    
    return 0;
    
    }

    方法六:结束符做交换空间,即使用字符串结束符所在的位置作为交换空间,交换完毕后再将其置为

    代码如下:

    #include "stdafx.h"
    #include <stdio.h>
    char* Reverse(char* s)
    {
        char* r = s;
        char* p = s;
        while (*p != '') p++;
        char* q =p - 1;
        while (q > s)
        {
            *p = *q;
            *q = *s;
            *s = *p;
            s++;
            q--;
        }
        *p = '';
        return r;
    }
    int main()
    {
        char a[] = "abcd";
        printf("%s
    ", Reverse(a));
        getchar();
        return 0;
    }

        效果如图:

  • 相关阅读:
    Javascript内容整理——BOM
    前端实现excel报表,vue+luckysheet
    代码转图片 的一个好用网站
    推荐一个非常好用前端在线编辑器!!! 一点都不卡
    前端常用的一些网站
    vue中使用moment,如何按需打包?
    better-scroll
    时间线
    碎纸屑动画
    动画
  • 原文地址:https://www.cnblogs.com/cysolo/p/3620453.html
Copyright © 2011-2022 走看看