【C语言】好题分享——序列中删除指定元素

article/2025/10/3 2:12:11

目录

  • 前言
  • 1️⃣题目
  • 2️⃣破题思路及代码演示
    • 1.错误反思
    • 2.正确示范
  • 3️⃣题目延伸
    • 💡思路一:
    • 💡思路二:
  • 4️⃣总结:


前言

🎉在此先祝xdm五一快乐!!


那么,从本blog开始,往后将会定期总结整理一些本人认为较有代表性的题目,分享给大家一些我的思路以及做题过程中的心得体会,如果有错误的地方也欢迎大家指正!一起学习,共同进步。



1️⃣题目

❓ 输入一个字符串以及指定一个字符,并删除字符串中指定的字符,如果字符串中没有该字符则不删除。



2️⃣破题思路及代码演示

1.错误反思

由题目我得出一个思路,创建一个字符数组(既字符串),再从中删除指定的字符。仔细回想所学过的C语言知识,发现目前为止学到的并没有一个能直接删除数组中元素的指令,那我该如何模拟实现这个删除呢?第一次解题时我敲出了如下代码(前方高能!buggg来了):

int main()
{char str[99] = "0";gets(str);//输入目标字符串char del = getchar();//输入指定删除的字符int i = 0;for (i = 0;str[i]!='\0';i++){if (str[i] == del){str[i] = NULL;}}puts(str);return 0;
}

结果:
在这里插入图片描述

什么!删除之后整个字符串都被删除了!?
⭕这里我犯了一个错误,把空字符NULL误认为是无字符了,其实NULL也是一个字符,它就是我们熟知的’\0’字符串结束标志,ASCII码是0。这里我认为的将字符串的第一个字符删除实际上是将其替换为’\0’,因此输出字符串时遇到第一个字符就是’\0’,那么也就不会再输出后面的内容了。


2.正确示范

那么我们到底如何模拟实现“删除”功能呢?
💡思路:我们可以想象这样一个场景。当我们去食堂排队买饭时,每次前面一位同学刚刚买完离开,后面的所有同学都依次往前移动一位(这里称之为一次移动),填补掉前面的空位。每进行一次移动,原位上的人都不相同。如果队列中间有某位同学突然不想吃这家的饭离开了队列,那么他前面的队伍保持不变,而后面的队伍向前移动一次。
一样的道理,我们可以把字符串中指定删除的字符看成这位中途离开的同学,删除指定字符可以转换为后面的所有元素往前进位,填补掉这个字符。

通过动图,让原理一目了然!
在这里插入图片描述

如何用代码实现这一功能呢?
⭕代码演示如下:

#include<stdio.h>
int main()
{char str[99] = "0";gets(str);//输入目标字符串char del = getchar();//输入指定删除的字符int i = 0;for (i = 0;str[i]!='\0';i++)//枚举字符串中所有字符('\0'除外){if (str[i] == del)//寻找指定删除的字符{int j = 0;for (j = i;str[j] != '\0';j++)//找到之后,开始从后面往前填补{str[j] = str[j + 1];}i--;}}printf("删除后的字符串:");puts(str);return 0;
}

⭕结果:
在这里插入图片描述
通过监视我们能更加直观的观察到删除指定字符的实现:
在这里插入图片描述在这里插入图片描述

可以看到,删除功能执行之后,第一个元素从’I’变成了逗号’,‘,而且第一个’\0’的位置从下标10变为下标9。可见,该字符串的字符个数确实减少了一个。

如果字符串中有重复多个指定删除字符,功能依然可以实现。
在这里插入图片描述


3️⃣题目延伸

🧐上述是删除字符串中的指定字符的方法。我们知道,在C语言中不仅有字符数组,更常见的是整数数组,那么想要在整数序列(也就是整数数组)中删除指定整数应该怎么实现呢?下面看一道例题。

有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
第一行输入一个整数(0≤N≤50)。
第二行输入N个整数,输入用空格分隔的N个整数。
第三行输入想要进行删除的一个整数。
输出描述:
输出为一行,删除指定数字之后的序列。

————来源:牛客网


我们知道,字符串数组的最后有’\0’作为结束标志,无论第一个‘\0’在什么位置,只要输出函数的输出格式是字符串(printf中格式控制符是%s和puts(字符串名)),遇到‘\0’就会停止输出,所以我们在实现删除指定字符的时候,由于‘\0’也跟着移动,字符串的长度会实时地根据‘\0’的位置而变化。但是,整数数组可没有这个功能,那该如何实现删除功能呢?

🔻🔻

💡思路一:

规定整数序列长度N后,在遍历数组过程中,每遇到一个指定删除数字,执行一次移动(后面数字往前补位)之后,序列长度N减一,最后打印出字符序列只需用一个循环变量大于0小于N的循环即可

⭕代码演示如下

#include <stdio.h>
int main()
{int arr[50] = { 0 };int N = 0;scanf("%d", &N);//规定了整数序列的长度int i = 0;for (i = 0;i < N;i++)//给整数序列中的每一个数赋值{scanf("%d", &arr[i]);}int del = 0;scanf("%d", &del);//输入想要删除的数for (i = 0;i < N;i++)//关键来了!!!{if (arr[i] == del)//寻找指定删除的数{int j = 0;for (j = i;j < N;j++){arr[j] = arr[j + 1];//从这个数开始往后的数向前补位}N--;//删除(补位)完毕后,整数序列长度减一i--;//数组下标先减一再加一,确保了两个重复的删除数挨在一起的情况}}for (i = 0;i < N;i++)//打印出来整数序列的每一个数(不是打印整个数组){printf("%d ", arr[i]);}return 0;
}

⭕运行结果:

在这里插入图片描述
⭕助理解图:
在这里插入图片描述

💡思路二:

所谓删除,换句话说,不就是留下想要的去除不要的吗?那么我们可以换个角度考虑,只要我们把不是指定删除的数字留下来,就可以实现与思路一同样的效果,那么具体该如何实现呢?见如下代码。

⭕代码演示如下:

#include <stdio.h>
int main()
{int arr[50] = { 0 };int N = 0;scanf("%d", &N);//规定了整数序列的长度int i = 0;for (i = 0;i < N;i++)//给整数序列中的每一个数赋值{scanf("%d", &arr[i]);}int del = 0;scanf("%d", &del);//输入想要删除的数int j = 0;for (i = 0;i < N;i++){if (arr[i] != del)//找出每一个非指定删除数的数字。{arr[j++] = arr[i];//留下一个j就加一,最后j是数组长度(这里的j++是先调用j再自增1)}}printf("删除后的序列:");for (i = 0;i < j;i++)//打印出来整数序列的每一个数(这里的j表示数组长度){printf("%d ", arr[i]);}return 0;
}

⭕运行结果:
在这里插入图片描述
⭕助理解图:
在这里插入图片描述
注:省略号后的元素都为0

回到第一道例题。利用思路二我们还可以改造一下删除字符串中的指定字符的模拟实现,具体如下:

int main()
{char str[99] = "0";gets(str);char del = getchar();int i = 0;int j = 0;for (i = 0;str[i] != '\0';i++){if (str[i] != del){str[j++] = str[i];}}printf("删除后的字符串:");for (i = 0;i < j;i++){printf("%c", str[i]);}return 0;
}

📌对比思路一,思路二的效率会更快一些。但两种模拟实现删除指定元素的方法,思路一却似乎更有“删除”的意思。



4️⃣总结:

今天的分享就到这里啦!欢迎大家批评指正,如果看过之后有收获,不妨点个赞呀!如果大家有更好的思路,欢迎向我留言!
🎉🎊🎈最后,祝大家五一快乐,天天进步,写程序永远写不出bug!!!!


http://chatgpt.dhexx.cn/article/eKRsGpGC.shtml

相关文章

33.【C语言】删除数组中的重复元素(Demo)

算法思想 定义4个变量i、j、k&#xff0c;变量i用于控制外层循环的趟数&#xff0c;外层循环每执行一趟&#xff0c;数组arr的有效长度就缩小&#xff0c;大小为k值。在有效长度为k的范围内arr[i]是没有重复元素的。内层循环j和k每次的初值都是i1&#xff0c;即每次从arr[i]的…

LeetCode移除元素(C语言)

给定一个排序数组&#xff0c;你需要在原地删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums [1,1,2…

C语言删除数组中的重复元素(详细分析版)

&#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f389;推荐up主专题文章 C语言100道经典编程题【详细分析版】 &#x1f4cc;QQ&#xff1a;3052645092 不明白或有问题可以一起讨论哦 &#x1f36d;作者水平很有限&#xff0c;如果发现…

删除多个元素(C语言实现)

删除多个元素 描述格式样例题解及详细注释 描述 从长度为n的整数序列中删除指定位序的m个元素&#xff0c;按照原顺序输出剩余的元素。其中&#xff0c;1≤m≤n≤1000&#xff0c;原整数序列为a&#xff1b;要删除的元素位序按照严格单调递增的方式存储在序列b中&#xff0c;其…

删除数组中重复的元素 C语言

题目介绍&#xff1a; 逻辑实现&#xff1a; 用两个下标 第一个下标src为第二个元素 第二个下标dst为第一个元素 而后 当srcsrc-1时&#xff0c;src&#xff0c;指向下一个元素 &#xff0c;dst不动&#xff0c;如果不等于时候 把src-1的值赋值给dst 尔后两者 注意&#xff1…

详细讲解:C语言删除数组中的某一值的所有元素

具体要求是这样的&#xff0c;通过键盘向程序输入数组中需要删除的数字&#xff0c;程序接到输入后删除数组中所有需要删除的数字。例如&#xff1a; 数组 a[10]{1,2,4,6,4,8,6,2,6,7} 删除数字 :6 输出结果&#xff1a;1 2 4 4 8 2 7想要实现这个功能&#xff0c;其基本思想…

删除数组中重复元素(C语言)

编写函数&#xff0c;删除数组中所有的重复元素&#xff0c;使数组变成一个集合&#xff0c;函数返回集合中元素的个数。 书上习题 #include<stdio.h> int set(int a[],int n) {int i,j,k;for(i0;i<n;i)//每次以a[i]为比较标准{ji1;ki1;while(j<9){if(a[j]a[i]){j…

C语言实现删除元素

给定一组数组&#xff0c;输入一个下标&#xff0c;删除该下标元素并将删除后的数组打印出来。 解题思路&#xff0c;我们主要解决的是删除问题&#xff0c;可以给定一个变量进行循环&#xff0c;让此变量从要删除的下表开始&#xff0c;让被删除的下标的后一个元素赋值给前一个…

STM32工作笔记0021---4G通信模块CAT1和CAT4的区别

技术交流QQ群【JAVA,C,Python,.NET,BigData,AI】&#xff1a;170933152 同是4G模块&#xff0c;CAT1与 CAT4模块的区别有哪些 二 、CAT 与CAT4应用场景对比 CAT1的应用场景&#xff1a;穿戴式设备、智能家电、工业传感器、水文水利的检测、港口物流跟踪。共享支付类。对于宽带…

catboost介绍

一、Catboost简介 全称&#xff1a;Gradient Boosting(梯度提升) Categorical Features(类别型特征)作者&#xff1a;俄罗斯的搜索巨头Yandex官方地址论文链接 | 项目地址 文档地址视频 二、Catboost的特点 一般来说&#xff0c;Gradient Boosting(GB)方法适用于异质化数据。…

nb模块不能接收公网消息_nb模块不能接收公网消息_4G模块Cat1与Cat4的区别究竟在哪里呢?它又为何吸引众多Cat4用户的眼光呢?......

Cat1突然火了&#xff0c;众多行业大佬为其背书。 Cat1凭借其低成本、低功耗等优势与NB-IoT一同扛起了中低速率物联网市场大旗。 与此同时&#xff0c;Cat1也引来众多Cat4用户关注。 那Cat1与Cat4的区别究竟在哪里呢?它又为何吸引众多Cat4用户的眼光呢&#xff1f; 成本优势 1…

【内网学习笔记】20、Hashcat 的使用

1、介绍 Hashcat 是一款用于破解密码的工具&#xff0c;据说是世界上最快最高级的密码破解工具&#xff0c;支持 LM 哈希、MD5、SHA 等系列的密码破解&#xff0c;同时也支持 Linux、Mac、Windows 平台。 工具地址&#xff1a;https://hashcat.net 项目地址&#xff1a;http…

Cat.1和Cat.4的区别

Cat.1 Cat.4 NB-LOT 1.比较2.Cat.1和Cat.4 介绍 1.比较 2.Cat.1和Cat.4 介绍 要区别Cat.1和Cat.4&#xff0c;首先我们要知道Cat是什么。Cat 是 Category 的缩写&#xff0c;中文意思是“类别&#xff0c;种类”。Cat 后面的数字即代表不同的种类&#xff0c;3GPP 将不同种类的…

CAT1 与CAT4 区别与应用

要区别Cat.1和Cat.4&#xff0c;首先我们要知道Cat是什么。Cat 是 Category 的缩写&#xff0c;中文意思是“类别&#xff0c;种类”。Cat 后面的数字即代表不同的种类&#xff0c;3GPP 将不同种类的网络用 “Cat.X” 格式命名。根据 3GPP Release 定义&#xff0c;Cat.X 是用来…

生活网络常识—CAT1与CAT4的区别

大家好&#xff0c;今天给大家讲讲CAT1与CAT4的区别&#xff1b; 给出一张图片让大家生动地看到它们之前的差距与不同&#xff1b; 什么是Cat1与Cat4&#xff1f; 通俗来说我们可以理解为4G网络&#xff08;LTE&#xff09;的种类&#xff0c;分别代表UE的接入能力等级&#…

CAT1和CAT4的区别

现今&#xff0c;CAT1的发展势头一直很迅猛&#xff0c;那为什么CAT4不能替代CAT1的地位呢&#xff1f;&#xff0c;我们来看下面几点&#xff1a; 成本 1. 网络建设方面&#xff0c;Cat1可以无缝接入现有LTE网络当中&#xff0c;无需针对基站进行软硬件升级&#xff0c;网络…

Cat.1、Cat.4、4G之间的区别

什么是Cat.1&#xff1f; Cat.1的全称是LTEUE-Category1&#xff0c;其中UE指的是用户设备&#xff0c;它是LTE网络下用户终端设备的无线性能的分类。根据3GPP的定义&#xff0c;UE类别以1-15分为15个等级。Cat.1&#xff0c;可以称为“低配版”的 4G 终端&#xff0c;上行峰值…

Cat.1和Cat4的应用场景有什么区别

Cat.1是4G通信LTE网络下用户终端类别的一个标准。随着2G网络的承载能力进一步减弱&#xff0c;在新部署的物联网连接中NB-IoT、4G会逐步替代2G模组。相比NB-IoT&#xff0c;Cat.1在网络覆盖、速度和延时上均有优势;相比传统的LTE Cat.4模组则拥有低成本和低功耗优势。 Cat.1与C…

4G通信模块CAT1和CAT4的区别

简介 LTE CAT全名LTEUE-Category&#xff0c;拆开来解释:LTE指的是4GLTE网络、UE是指用户设备、Category翻译为等级。通顺解释就是用户设备能够支持的4GLTE网络传输速率的等级&#xff0c;也可以说成是4G网络速度的一个技术标准。所以LTE CAT1/CAT4就是指用户设备LTE网络接入能…

Python软件编程等级考试一级——20220618

Python软件编程等级考试一级——20220618 理论单选题判断题 实操第一题计算长方形的面积 画图题 Python软件编程等级考试一级——20220618——真题解析 理论 单选题 1、在Python编辑器中写好程序代码后&#xff0c;在Run菜单中&#xff0c;下列哪个命令可以用来执行程序&…