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

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

目录

  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;

}

相关文章
|
算法 C++
C++快速幂(递归)
C++快速幂(递归)
|
8月前
题目----递归和非递归分别实现求n的阶乘(不考虑溢出的问题)
题目----递归和非递归分别实现求n的阶乘(不考虑溢出的问题)
30 1
顺序表应用7:最大子段和之分治递归法
顺序表应用7:最大子段和之分治递归法
递归和非递归分别实现求第n个斐波那契数
递归和非递归分别实现求第n个斐波那契数
75 0
字符串的逆序(循环和递归两种解法)
字符串的逆序(循环和递归两种解法)
227 0
汉诺塔(递归+ 非递归版)
汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题。在A,B,C三根柱子上, 有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔。 游戏中的每一步规则如下:
265 1
汉诺塔(递归+ 非递归版)
字符串逆序(递归和非递归实现)
给连两个指针,left放在字符串左侧,right放在最后一个有效字符位置。 交换两个指针位置上的字符
C#中汉诺塔问题的递归解法
百度测试部2015年10月份的面试题之——汉诺塔。 汉诺塔就是将一摞盘子从一个塔转移到另一个塔的游戏,中间有一个用来过度盘子的辅助塔。 百度百科在此。 游戏试玩在此。 用递归的思想解决汉诺塔问题就是分为两种情况: 第一种情况是只有一个盘子的情况,也就是最基本的情况,这种情况下,直接将该盘子从原始塔转移到目标塔即可胜利; 第二种情况是右n个盘子的情况,也就是普遍情况,这种情况下,要将除了最底下的那个盘子以外的(n-1)个盘子从原始塔转移到辅助塔,再把最底下的那个盘子(第n个盘子)从原始塔转移到目标塔,最后将辅助塔的(n-1)个盘子从辅助塔转移到目标塔。
1851 0