C语言实现字符串字符反向排列的方法详解

目录
  • 前言
  • 非递归方法
    • 1.循环实现
    • 2.函数实现
  • 递归方法
    • 1.递归方法
    • 2.递归方法
  • 小结

前言

重点的话说在前头,注意不是逆序打印

今天写题,碰到一个很好的题,在这里来个大家做个分享,我会用多种方法来解决

题目具体内容如下:

编写一个函数(递归实现)

实现:将参数字符串中的字符反向排列,不是逆序打印。

要求:不能使用C函数库中的字符串操作函数

但是这里我不会仅仅局限于题目的要求

非递归方法

1.循环实现

1.1循环实现(sizeof)

#include <stdio.h>

int main()
{
    char arr[] = "abcdef";//[a b c d e f \0]
    int sz = sizeof(arr) / sizeof(arr[0]);//sizeof会算上\0
    int left = 0;
    int right = sz - 2;//-2 很关键
    while (left < right)
    {
        char tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;

        left++;
        right--;
    }
    printf("%s\n", arr);
    return 0;
}

重难点:看代码给right赋值的那一行,为什么用的是sz-2?

原因就是sizeof会计算字符串中的\0,会让计算的数组元素多1,这里需要减1,再加上数组第一位从0开始,再减1,故需要减2

1.2循环实现(strlen)

#include <stdio.h>
#include <string.h>

int main()
{
    char arr[] = "abcdef";//[a b c d e f \0]
    int left = 0;
    int right = strlen(arr) - 1;//strlen不会算上\0
    while (left < right)
    {
        char tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;

        left++;
        right--;
    }
    printf("%s\n", arr);
    return 0;
}

重难点:这里和1.1形成鲜明的对比,right只需要求出来的数减1,原因就在strlen不会计算字符串末尾的\0

2.函数实现

#include <stdio.h>
#include <string.h>

void reverse(char arr[])//arr[]和*arr是一个意思(都指的首元素地址)
{
    int left = 0;

    //int sz = sizeof(arr) / sizeof(arr[0]);
    //int right = sz - 2;//这里通过函数调用的方式时,在函数内部使用sizeof不行,会出错。。。。。。详见相关博客
    int right = strlen(arr) - 1;//strlen不会算上\0

    while (left < right)
    {
        char tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;

        left++;
        right--;
    }
}

int main()
{
    char arr[] = "abcdef";
    reverse(arr);
    printf("%s\n", arr);
    return 0;
}

重难点:第一个(是我自己一开始没有理解的),这里的arr[]和*arr是一个意思(都指的首元素地址),也就是说,是一个意思,两种写法而已。

第二个,这里的不能通过函数调用的方式时,在函数内部使用sizeof计算会出错,因为数组传参传进去的只是首元素的地址,故无法准确计算出来。

这里sizeof具体解释我找到了一个写得蛮好的文章,分享给大家

递归方法

1.递归方法

结果和题目一致,但是不满足题目所给要求,这里只是思路比较简单

#include <stdio.h>
#include <string.h>

void reverse(char arr[], int left, int right)
{
    if (left < right)
    {
        char tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        reverse(arr, left + 1, right - 1);
    }
}

int main()
{
    char arr[] = "abcdef";//[a b c d e f \0]
    int left = 0;
    int right = strlen(arr) - 1;
    reverse(arr,left,right);
    printf("%s\n", arr);
    return 0;
}

重难点:第一这里使用了库函数strlen

第二这里自定义的函数使用了三个参数

但是!这个思路非常清晰明了

2.递归方法

完全满足题目要求,这里需要注重理解了,思路很重要

#include <stdio.h>

int my_strlen(char* str)
{
    int count = 0;
    while (*str != '\0')
    {
        count++;
        str++;
    }
    return count;
}

void reverse(char* str)
{
    int len = my_strlen(str);
    char tmp = *str;//1
    *str = *(str + len - 1);//2
    *(str + len - 1) = '\0';//3
    if (my_strlen(str + 1) >= 2)
        reverse(str + 1);//4
    *(str + len - 1) = tmp;//5
}

int main()
{
    char arr[] = "abcdef";//[a b c d e f \0]
    reverse(arr);
    printf("%s\n", arr);
    return 0;
}

重难点:第一:这里我们便可以自定义一个和strlen功能类似的函数即可

第二:是本文最难的地方,我放一张图片,大家看看整体思路,一共五步,对应着五步代码

小结

一道题目,如果每天太多限制条件的话,解决的方法是有很多的,一千个人可以写出一千种形式。所以以上只是一些胡思乱想

到此这篇关于C语言实现字符串字符反向排列的方法详解的文章就介绍到这了,更多相关C语言字符反向排列内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用C语言解决字符串全排列问题

    问题 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路 这是典型的递归求解问题,递归算法有四个特性: 必须有可达到的终止条件,否则程序陷入死循环 子问题在规模上比原问题小 子问题可通过再次递归调用求解 子问题的解应能组合成整个问题的解 对于字符串的排列问题: 如果能生成n-1个元素的全排列,就能生成n个元素的全排列.对于只有一个元素的集合,可以直接生成全排列.所以全排列的递归终

  • C语言实现输入一个字符串后打印出该字符串中字符的所有排列

    本文实例讲述了C语言实现输入一个字符串后打印出该字符串中字符的所有排列的方法,属于数学里的排列问题.是一个很实用的算法技巧.分享给大家供大家参考.具体实现方法如下: 例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. C语言实现代码如下: /* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream> #include <al

  • C语言实现字符串字符反向排列的方法详解

    目录 前言 非递归方法 1.循环实现 2.函数实现 递归方法 1.递归方法 2.递归方法 小结 前言 重点的话说在前头,注意不是逆序打印 今天写题,碰到一个很好的题,在这里来个大家做个分享,我会用多种方法来解决 题目具体内容如下: 编写一个函数(递归实现) 实现:将参数字符串中的字符反向排列,不是逆序打印. 要求:不能使用C函数库中的字符串操作函数 但是这里我不会仅仅局限于题目的要求 非递归方法 1.循环实现 1.1循环实现(sizeof) #include <stdio.h> int mai

  • C语言实现短字符串压缩的三种方法详解

    目录 前言 一.通用算法的短字符压缩 二.短字符串压缩 (1)Smaz (2)Shoco (3)Unisox2 三.总结 前言 上一篇探索了LZ4的压缩和解压性能,以及对LZ4和ZSTD的压缩.解压性能进行了横向对比.文末的最后也给了一个彩蛋:任意长度的字符串都可以被ZSTD.LZ4之类的压缩算压缩得很好吗? 本篇我们就来一探究竟. 一.通用算法的短字符压缩 开门见山,我们使用一段比较短的文本:Narrator: It is raining today. So, Peppa and George

  • 基于JavaScript中字符串的match与replace方法(详解)

    1.match方法 match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. match()方法的返回值为:存放匹配结果的数组. 2.replace方法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. replace方法的返回值为:一个新的字符串. 3.说明 以上2个方法的参数在使用正则表达式时主要添加全局g,这样才能对字符串进行全部匹配或者替换. 示例代码: <!DOCTYPE html> <html lang

  • C#给Word中的字符添加着重号的方法详解

    目录 前言 引入dll 方法1 方法2 添加强调符号 C# vb.net 前言 在Word中添加着重号,即强调符号,可以在选中字符后,鼠标右键点击,选择“字体”,在窗口中可直接选择“着重号”添加到文字,用以对重要文字内容起加强提醒的目的,如下图: 通过C#,我们可以查找到需要添加着重号的字符串,然后通过字符串格式的属性值来添加符号.下面,将对此做详细介绍. 引入dll 方法1 手动引入 将 Free Spire.Doc for .NET 下载到本地,解压,安装.安装完成后,找到安装路径下BIN文

  • Java实现字符串转为驼峰格式的方法详解

    字符串转为驼峰格式 构建工具类 package com.yt.common.util; import com.yt.common.dto.NameCode; import com.yt.exam.enums.ZyEnum; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 字符串转为驼峰格式 构建工具类 * @author LYY * @date 2022/07

  • C语言实现手写JSON解析的方法详解

    目录 什么是JSON JSON支持的数据类型 JSON语法规则 JSON的解析 JSON基本语法 编写解析器 头文件 实现文件 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,用来传输属性值或者序列性的值组成的数据对象. JSON是JavaScript的一个子集. 具有良好的可读性和便于快速编写的特性. JSON是独立于语言的文本格式,并且采用了类似C语言家族的一些习惯. JSON数据格式与语言无关,是目前网络中主流的数据传输格式之一,

  • 对python 匹配字符串开头和结尾的方法详解

    1.你需要通过指定的文本模式去检查字符串的开头或者结尾,比如文件名后缀,URL Scheme 等等.检 查 字 符 串 开 头 或 结 尾 的 一 个 简 单 方 法 是 使 用str.startswith() 或 者 是str.endswith()方法.比如: >>> filename = 'spam.txt' >>> filename.endswith('.txt') True >>> filename.startswith('file:') Fa

  • 通过字符串导入 Python 模块的方法详解

    我们平时导入第三方模块的时候,一般使用的是 import 关键字,例如: import scrapy from scrapy.spider import Spider 但是如果各位同学看过 Scrapy 的 settings.py 文件,就会发现里面会通过字符串的方式来指定pipeline 和 middleware,例如: DOWNLOADER_MIDDLEWARES = { 'Test.middlewares.ExceptionRetryMiddleware': 545, 'Test.midd

  • Go语言基础语法之结构体及方法详解

    结构体类型可以用来保存不同类型的数据,也可以通过方法的形式来声明它的行为.本文将介绍go语言中的结构体和方法,以及"继承"的实现方法. 结构体类型 结构体类型(struct)在go语言中具有重要地位,它是实现go语言面向对象编程的重要工具.go语言中没有类的概念,可以使用结构体实现类似的功能,传统的OOP(Object-Oriented Programming)思想中的继承在go中可以通过嵌入字段的方式实现. 结构体的声明与定义: // 使用关键字 type 和 struct 定义名字

  • python字符串反转的四种方法详解

    这篇文章主要介绍了python字符串反转的四种详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.用reduce函数方法 book = 'Python程序设计' result = reduce(lambda x,y:y+x,book) print(result) 2.字符串切割 book = 'Python程序设计' print(book[::-1]) 3.用reversed方法,把字符串变成列表反转后拼接 result = reverse

随机推荐