字符串逆序不一样的解法(递归)

简介: 字符串逆序不一样的解法(递归)

目录

  1. ✨常规解法
  2. ✨不一样的解法(递归)

前言

前段时间在做题的时候,看见一题字符串逆置的题目,刚开始我寻思着这不挺简单的吗?

在这里插入图片描述

我咔咔开始写,后来发现题目要求居然要我用递归求解!!

题目描述:
编写一个函数 reverse_string(char * string)(递归实现)
不能使用C函数库中的字符串操作函数

在这里插入图片描述

那时刚学完C语言函数,只是短短认识了几个递归求解的题目。我滴亲娘,该怎么搞呀!而且它只能有一个参数!!在这里插入图片描述

没办法了,当时只能找教程了,现在我就再复刻一下当时的题目,教大家如果用递归逆置字符串!

下面第一个是我当时写的常规解法:

✨常规解法
常规解法就是用left指向第一个下标,用right指向倒数一个下标,将第一个和倒数第一个交换,然后移动左右下标,再将第二个和倒数二个交换......直到 left=right就结束
在这里插入图片描述
void reverse_string(char* arr)
{
    char *left = arr;
    char *right = arr+strlen(arr)-1;
 
 
    while(left<right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
 
 
        left++;
        right--;
    }
}

✨不一样的解法(递归)

学的递归解法:
递归思想就是大事化小:要逆置/abcdef \

    可以转变成   先逆置:/bcde\       
    然后再变成逆置/cd\
    .......

例如“abcdef”第一次进去就是首先要求字符串长度,找到最后一个,然后先把它存储起来,再把最后一个位置的元素置成“\0”;再把下一个元素的指针传给这个函数,下一次进去就变成“bcde”,
之后就再重新求字符串长度,再把最后一个字符存储起来,把最后一个位置成“\0”,
继续重复以上步骤直到字符长小于2就停止
然后嘞在调完递归后依次把字符交换即可

要注意题目要求是不能用C语言库函数,所以不能使用strlen来求字符串长度,但是我们可以自己模仿实现一个my_strlen求字符串长度
在这里插入图片描述

代码实现>

//计算字符串长度
int my_strlen(char* p)
{
    int count = 0;
    while (*p != '\0')
    {
        count++;
        p++;
    }
    return count;
}
//逆置字符串
void reverse_string(char* p)
{
    int len = my_strlen(p);    
    char tem = *(p + len - 1);
    *(p + len - 1) = '\0';
    if (my_strlen(p + 1) >= 2)
    {
        reverse_string(p + 1);
    }
    *(p + len - 1) = *p;
    *p = tem;

}

相关文章
|
8月前
题目----递归和非递归分别实现求n的阶乘(不考虑溢出的问题)
题目----递归和非递归分别实现求n的阶乘(不考虑溢出的问题)
30 1
|
8月前
|
人工智能 C++
查找题(二分解法c++)
查找题(二分解法c++)
69 0
|
编译器
位运算、递推与递归
位运算、递推与递归
52 0
【递归进阶练习】全排列
【递归进阶练习】全排列
56 0
递归和非递归分别实现求第n个斐波那契数
递归和非递归分别实现求第n个斐波那契数
75 0
字符串的逆序(循环和递归两种解法)
字符串的逆序(循环和递归两种解法)
221 0
|
存储
【C】逆序字符串(俩种递归思路)
【C】逆序字符串(俩种递归思路)
101 0
【C】逆序字符串(俩种递归思路)
字符串逆序(递归和非递归实现)
给连两个指针,left放在字符串左侧,right放在最后一个有效字符位置。 交换两个指针位置上的字符