当前位置: 首页 > news >正文

C语言题目的多种解法分享 2之字符串左旋和补充题

前言

有的时候,这个系列专栏中的解法之间并无优劣,只是给大家提供不同的解题思路

我决定将代码实现的过程写成注释,方便大家直接找到对应的函数,只有需要补充说明的知识才会单拿出来强调

这个系列的文章会更的比较慢,因为多种解法的需要慢慢收集、整理

字符串左旋

实现一个函数,可以左旋字符串中的k个字符。

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

暴力求解法1:数组传参

#include<stdio.h>
#include<string.h>void left_move(char arr[], int k)
{int i = 0;int len = strlen(arr);for (i = 0; i < k; i++){char tmp = arr[0];int j = 0;for (j = 0; j < len - 1; j++){arr[j] = arr[j + 1];}arr[len - 1] = tmp;}
}int main()
{int k = 0;scanf("%d", &k);char arr[] = "abcdef";printf("%s\n", arr);left_move(arr,k);printf("%s\n", arr);return 0;
}

在此简单的解释一下:先将前面的元素提取出来存在别的地方,然后后面的元素向前移动一位,再将前面的元素放在后面
通过循环即可实现

暴力求解法2:指针传参


#include<stdio.h>
#include<string.h>
#include<assert.h>//函数主体(应用场景)void left_move(char *arr, int k)
{assert(arr);//为了良好的代码风格(前面在《实用调试技巧》中有提到过),我们可以在函数体开头使用断言,防止arr是空指针int i = 0;for (i = 0; i < k; i++)//旋转一个字符{int len = strlen(arr);//求数组长度char* tmp = arr;//存储第一个元素int j = 0;for (j = 0; j < len - 1; j++)//把后面的元素都向前移动一位{*(arr + j) = *(arr + j + 1);//因为此处会访问到j+1,所以如果j<len的话,会出现数组越界的情况,所以在for循环的判断那里要注意一下}*(arr + len - 1) = tmp;//将第一个元素存储到最后}}int main()
{char arr[] = "abcdef";int k = 0;scanf("%d", &k);left_move(arr, k);//左旋函数printf("%s\n", arr);//输出结果return 0;
}

提示:使用assert

使用assert可以改善我们的代码风格,具体原因在我的另一篇文章中有详细说明,感兴趣的朋友可以去看一看

三步翻转法

思路:

先逆序前k个元素,再逆序后面的元素,最后再逆序整体
也就是同一个逆序函数要调用三次,我们为了整洁,就单独封装出一个reverse函数

需求:
想要实现逆序,就需要知道两端的地址

reverse函数

void reverse(char* left, char* right)
{assert(left);//建议存在指针传参的时候,就使用断言,反正也不吃亏assert(right);while (left<right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}}

left_move函数

void left_move(char* arr, int k)
{assert(arr);int len = strlen(arr);assert(len);//判断k是否超出数组大小reverse(arr, arr + k - 1);//逆序左边k个元素reverse(arr + k, arr + len - 1);//逆序右边的元素reverse(arr, arr + len - 1);//逆序整体}

代码

#include<stdio.h>
#include<string.h>
#include<assert.h>void reverse(char* left, char* right)
{assert(left);assert(right);while (left<right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}}void left_move(char* arr, int k)
{assert(arr);int len = strlen(arr);assert(len);reverse(arr, arr + k - 1);//逆序左边k个元素reverse(arr + k, arr + len - 1);//逆序右边的元素reverse(arr, arr + len - 1);//逆序整体}int main()
{char arr[] = "abcdef";int k = 0;scanf("%d", &k);left_move(arr, k);//左旋函数printf("%s\n", arr);//输出结果return 0;
}

拓展

做一道类似的题,帮助大家巩固

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 =AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

解法一:穷举,列出所有可能

void reverse(char* left, char* right)
{assert(left);assert(right);while (left<right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}}int left_move(char* arr, int k)
{assert(arr);int len = strlen(arr);assert(len);reverse(arr, arr + k - 1);//逆序左边k个元素reverse(arr + k, arr + len - 1);//逆序右边的元素reverse(arr, arr + len - 1);//逆序整体}int is_left_move(char* s1, char* s2)
{int len = strlen(s1);//求字符串长度,来判断有多少种可能性int i = 0;for (i = 0; i < len; i++){left_move(s1, 1);//左旋的每种可能int ret =strcmp(s1, s2);//比较二者是否相等if (ret == 0){return 1;}}return 0;
}int main()
{char arr1[] = "abcdef";//此处不能使用指针,因为使用指针变量的话,它就是常量,是不能改变的char arr2[] = "cdefab";int ret = is_left_move(arr1, arr2);//接收返回值来判断是否是if (ret == 1){printf("yes\n");//是}else{printf("no\n");//不是}return 0;
}

解法二:双倍数组

创建两个数组,如果要对比的字符串,是这个大的数组的子集,那就符合要求,不然就不符合要求

is_left_move函数的实现


int is_left_move(char* s1, char* s2)
{int len2 = strlen(s2);//分为两步://1.在str1字符串中再放一个str1字符串,要确保str1足够大,并且str1一定要确定数组大小,不然在使用srtncat函数的时候会报错// strnact函数:字符串操作函数int len1 = strlen(s1);if (len1 != len2){return 0;}strncat(s1, s2, len1);//2.判断str2指向的字符串是否是str1指向的字符串的子串(类似子集)//strstr:找子串的函数char* ret = strstr(s1, s2);if (ret == NULL){return 0;}else{return 1;}return 0;
}

单独说明:

此处单独说明三个比较重要的函数:

stract与strnact

strcat:字符串操作函数,需要包含头文件<string.h>
语法格式:

stract(s1, s2);//把后者追加到前者的后面

但是,要注意自己追加自己是不能使用这个函数的,程序会直接报错

简单的解释一下:
我们创建两个数组,分别存储abc\0和def\0

想要追加的话,首先,要找到第一个字符串中的\0,然后用’d‘取代\0,之后存入ef\0,遇到\0说明追加结束,

而如果想要自己追加自己,我们还是要先找到\0,然后再放入abc,但当我们想放入\0时,却发现原来字符串中的\0已经被我替换成’a‘了,这样追加永远无法结束,程序崩溃~

在这里插入图片描述

那么我们可以使用strnact函数

语法格式
strnact(s1, s2, len)

此处简单的说明一下吧,strnact比stract多了一个参数
下图是二者的函数
在这里插入图片描述
在这里插入图片描述
strnact函数多了一个count参数
前者是直接追加,遇到\0,就停止追加
后者则是追加count位字符之后停止追加

strstr

字符串操作函数,找后者是不是前者的子串
语法格式:
strstr(s1, s2)

返回值的说明:
如果是子串,就返回s2的首元素地址

如果不是子串,就返回空指针NULL

小疑问

代码此时看起来已经可以运行了,但是小明这时候提出了一个疑问:
如果s2是cdef,输出结果是什么

输出结果是yes

这就是问题所在,所以我们在使用那些库函数之前,先要进行一个判断:s1和s2的长度是否相等,如果相等再去判断,如果不等,直接返回0结束判断。

最终代码:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<assert.h>int is_left_move(char* s1, char* s2)
{int len1 = strlen(s1);int len2 = strlen(s2);if (len1 != len2){return 0;}strncat(s1, s2, len1);char* ret = strstr(s1, s2);if (ret == NULL){return 0;}else{return 1;}}int main()
{char arr1[50] = "abcdef";//此处不能使用指针,因为使用指针变量的话,它就是常量,是不能改变的char arr2[] = "cdefab";int ret = is_left_move(arr1, arr2);//接收返回值来判断是否是if (ret == 1){printf("yes\n");//是}else{printf("no\n");//不是}return 0;
}

结语

本来是想整理五道题再发的,但现在刚写两道就四千多字了,那我想还是发出去吧,毕竟字符串左旋也比较经典,就单独列出一篇来。

希望对各位有帮助,我们下次见

相关文章:

C语言题目的多种解法分享 2之字符串左旋和补充题

前言 有的时候&#xff0c;这个系列专栏中的解法之间并无优劣&#xff0c;只是给大家提供不同的解题思路 我决定将代码实现的过程写成注释&#xff0c;方便大家直接找到对应的函数&#xff0c;只有需要补充说明的知识才会单拿出来强调 这个系列的文章会更的比较慢&#xff0…...

科技云报道:算力之战,英伟达再度释放AI“炸弹”

科技云报道原创。 近日&#xff0c;在计算机图形学顶会SIGGRAPH 2023现场&#xff0c;英伟达再度释放深夜“炸弹”&#xff0c;大模型专用芯片迎来升级版本。 英伟达在会上发布了新一代GH200 Grace Hopper平台&#xff0c;该平台依托于搭载全球首款搭载HBM3e处理器的新型Grac…...

油电同价、标配8155,奇瑞猛攻10-15万中型SUV市场

8月8日&#xff0c;奇瑞瑞虎8冠军家族在北京国家奥林匹克体育中心正式上市&#xff0c;推出了瑞虎8 PRO冠军版、瑞虎8新能源冠军版两款新车&#xff0c;燃油混动双线同步发力。 其中&#xff0c;瑞虎8 PRO冠军版共推7款车型&#xff0c;官方指导价12.69万元-16.39万元&#xf…...

【leetcode】【图解】617. 合并二叉树

题目 难度&#xff1a;简单 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xf…...

基于java的汽车改装方案网站设计与实现

摘要 本文主要讲述了基于SpringBootMySql开发技术开发的汽车改装方案网站的设计与实现。这里的汽车改装方案网站是通过一个平台使所有的汽车爱好者们可以不用出门就可以体验到专业的汽车改装方案设计服务。现实生活中如果需要进行汽车改装的方案设计&#xff0c;往往要跑很多次…...

DC电源模块减小输入电源与输出负载之间的能量损失

BOSHIDA DC电源模块减小输入电源与输出负载之间的能量损失 随着电子产品的普及&#xff0c;DC电源模块已成为现代电子设备中不可或缺的组成部分。DC电源模块可以将交流电转化为直流电&#xff0c;并根据需要&#xff0c;以适当的电压和电流提供给输出负载。然而&#xff0c;在输…...

Python自动化小技巧16——分类汇总写入excel不同sheet表

案例背景 上了两个月班的社畜博主最近终于有空来总结一下最近写的代码了。 因为上班都是文职工作&#xff0c;天天不是word就是excel就是PPT和pdf....这和什么机器学习还有数据科学不一样&#xff0c;任务更多的是处理实在的文字和表格等格式&#xff0c;按照领导要求来完成&…...

FlexRay汽车总线静电防护,如何设计保护方案图?

FlexRay是一种高速、实时、可靠、具备故障容错能力的总线技术&#xff0c;是继CAN和LIN总线之后的最新研发成果。FlexRay为线控应用&#xff08;即线控驱动、线控转向、线控制动等&#xff09;提供了容错和时间确定性性能要求。虽然FlexRay将解决当前高端和未来主流车载网络的挑…...

jpg图片太大怎么压缩?这样做轻松压缩图片

图片太大会给存储、分享带来麻烦&#xff0c;但其实现在压缩图片大小也不是什么难事&#xff0c;下面就给大家分享几个一直用的图片压缩方法&#xff0c;包含批量压缩、在线压缩、免费压缩等多种方式&#xff0c;大家按需自取哈~ 方法一&#xff1a;嗨格式压缩大师 这是一个可…...

B057-spring增强 依赖注入 AOP 代理模式 创建Bean

目录 AOP概念代理模式引出AOP实现方式xml方式实现注解方式实现 AOP 概念 事务管理&#xff1a;比如可以抽取try catch的重复代码 日志监控&#xff1a;比如业务逻辑前后打印关于当前订单数量的日志&#xff0c;了解业务做了什么 性能监控&#xff1a;比如业务前后打印时间&…...

小程序多图片组合

目录 子组件 index.js 子组件 index.wxml 子组件 index.wxss 父组件引用&#xff1a; 子组件&#xff1a;preview-image 子组件 index.js Component({properties: {previewData: {type: Array,default: [],observer: function (newVal, oldVal) {console.log(newVal, ol…...

YOLO v8目标跟踪详细解读(二)

上一篇&#xff0c;结合代码&#xff0c;我们详细的介绍了YOLOV8目标跟踪的Pipeline。大家应该对跟踪的流程有了大致的了解&#xff0c;下面我们将对跟踪中出现的卡尔曼滤波进行解读。 1.卡尔曼滤波器介绍 卡尔曼滤波&#xff08;kalman Filtering&#xff09;是一种利用线性…...

【广州华锐视点】AR电力职业技能培训系统让技能学习更“智慧”

随着科技的发展&#xff0c;教育方式也在不断地进步和创新。其中&#xff0c;增强现实(AR)技术的出现&#xff0c;为教育领域带来了全新的可能。AR电力职业技能培训系统就是这种创新教学方法的完美实践&#xff0c;它将虚拟与现实相结合&#xff0c;为学生提供了一个沉浸式的学…...

C#学习,反射

目录 C#学习 .NET的体系结构 二次编译 反射 什么是反射&#xff1f; 什么是Type&#xff1f; 什么是程序集&#xff1f; 反射API&#xff1a; 一&#xff0c;程序集 1&#xff0c; Load 2&#xff0c;LoadFrom 3&#xff0c;LoadFile 二&#xff0c;类型实例 1&a…...

代理模式概述

1.代理模式概述 学习内容 1&#xff09;概述 为什么要有 “代理” &#xff1f; 生活中就有很多例子&#xff0c;比如委托业务&#xff0c;黄牛&#xff08;票贩子&#xff09;等等代理就是被代理者没有能力或者不愿意去完成某件事情&#xff0c;需要找个人代替自己去完成这…...

最新AI系统ChatGPT网站程序源码+搭建教程/公众号/H5端/安装配置教程/完整知识库

1、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01;…...

前端Flex布局

day06-Flex布局 目标&#xff1a;熟练使用 Flex 完成结构化布局 01-标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 [外链图片转存失败,源站可能有防盗链机制,建议…...

文盘Rust -- Mutex解决并发写文件乱序问题 | 京东云技术团队

在实际开发过程中&#xff0c;我们可能会遇到并发写文件的场景&#xff0c;如果处理不当很可能出现文件内容乱序问题。下面我们通过一个示例程序描述这一过程并给出解决该问题的方法。 use std::{fs::{self, File, OpenOptions},io::{Write},sync::Arc,time::{SystemTime, UNI…...

数据结构算法--2 冒泡排序,选择排序,插入排序

基础排序算法 冒泡排序 思想就是将相邻元素两两比较&#xff0c;当一个元素大于右侧相邻元素时&#xff0c;交换他们的位置&#xff0c;小于右侧元素时&#xff0c;位置不变&#xff0c;最终序列中的最大元素&#xff0c;像气泡一样&#xff0c;到了最右侧。 这时冒泡排序第一…...

秋招面经——快手

Mysql mysql事务 共享锁与排他锁 共享锁&#xff1a;允许一个事务去读一行&#xff0c;阻止其他事务获得相同数据集的排他锁。&#xff08;读都允许读&#xff0c;但我在读不允许你去改&#xff09; 排他锁&#xff1a;允许一个事务去读一行&#xff0c;阻止其他事务获得相同…...

PowerToys中文汉化版:微软官方增强工具箱的终极本地化体验

PowerToys中文汉化版&#xff1a;微软官方增强工具箱的终极本地化体验 【免费下载链接】PowerToys-CN PowerToys Simplified Chinese Translation 微软增强工具箱 自制汉化 项目地址: https://gitcode.com/gh_mirrors/po/PowerToys-CN PowerToys中文汉化版是微软官方系统…...

2025届最火的六大AI科研平台推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在学术写作这个领域当中 &#xff0c;那论文AI网站正一步一步地变成研究者的重要辅助工具。这…...

AI赋能:让Kimi和DeepSeek在快马平台上帮你智能解决opencode安装难题

最近在折腾opencv的安装配置时&#xff0c;真是被各种依赖项和环境问题折磨得够呛。直到发现了InsCode(快马)平台的AI辅助开发功能&#xff0c;整个过程突然变得轻松多了。今天就想分享一下&#xff0c;如何用平台集成的Kimi和DeepSeek模型&#xff0c;打造一个智能化的opencv安…...

预警风波再起!这本物联网顶刊从中科院1区TOP跌落后,投稿风险几何?

1. 物联网顶刊降级风波&#xff1a;事实与传闻的边界 最近学术圈里关于《IEEE Internet of Things Journal》的讨论热度不减&#xff0c;这本曾经的中科院1区TOP期刊降级为2区的消息&#xff0c;叠加可能被列入预警名单的传闻&#xff0c;让不少准备投稿的研究人员心里打鼓。作…...

告别机械操作:AhabAssistantLimbusCompany重新定义游戏自动化体验

告别机械操作&#xff1a;AhabAssistantLimbusCompany重新定义游戏自动化体验 【免费下载链接】AhabAssistantLimbusCompany AALC&#xff0c;PC端Limbus Company小助手。AALC&#xff0c;Limbus Company Assistant on PC 项目地址: https://gitcode.com/gh_mirrors/ah/AhabA…...

5分钟让老旧打印机变身AirPrint无线打印神器:cups-avahi-airprint完全指南

5分钟让老旧打印机变身AirPrint无线打印神器&#xff1a;cups-avahi-airprint完全指南 【免费下载链接】cups-avahi-airprint Docker image for CUPS intended as an AirPrint relay 项目地址: https://gitcode.com/gh_mirrors/cu/cups-avahi-airprint 在苹果生态日益普…...

解决多显示器显示错乱难题:SetDPI带来的视觉一致性变革

解决多显示器显示错乱难题&#xff1a;SetDPI带来的视觉一致性变革 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 问题诊断&#xff1a;当多显示器成为工作障碍 为什么专业人士的多屏工作站反而降低效率&#xff1f;摄影师小林的修图软…...

dl-librescore:开源乐谱下载解决方案,打破MuseScore资源获取限制

dl-librescore&#xff1a;开源乐谱下载解决方案&#xff0c;打破MuseScore资源获取限制 【免费下载链接】dl-librescore Download sheet music 项目地址: https://gitcode.com/gh_mirrors/dl/dl-librescore 在音乐创作、教学和学习过程中&#xff0c;获取高质量乐谱资源…...

Jimeng AI Studio实现Web爬虫:数据采集自动化方案

Jimeng AI Studio实现Web爬虫&#xff1a;数据采集自动化方案 1. 项目背景与需求 电商公司每天需要从多个网站采集商品信息&#xff0c;传统的手工复制粘贴方式效率低下&#xff0c;而且容易出错。技术团队需要处理上百个商品页面的数据&#xff0c;包括价格、库存、描述和用…...

3步解决Windows视频播放难题:LAV Filters开源解码器终极方案

3步解决Windows视频播放难题&#xff1a;LAV Filters开源解码器终极方案 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters 你是否曾经遇到过这样的尴尬场景&…...