序列中删除指定数字【四种解法】

在这里插入图片描述


文章目录

  • 解法1:另辟空间法
  • 解法2:覆盖法
  • 解法3:覆盖法(进阶版)
  • 解法4:异或取巧法


  题目:有一个整数序列(可能存在重复的整数),编写程序删除序列中指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置不发生改变。

输入描述

 第1行:输入一个整数(0≤N≤50)。
 第2行:输入N个整数,输入用空格分隔的N个整数。
 第3行:输入想要进行删除的一个整数。

输出描述

 输出删除指定数字之后的序列。


解法1:另辟空间法

  另外创建一个数组(用来存放删除指定数字之后的序列),来实现输出删除指定数字之后的序列。代码如下:

#include<stdio.h>
void delete_num(int src[], int num, int del)
{
	int dest[50] = { 0 };
	int i = 0;
	int j = 0;
	int sz = num;
	//删除元素
	while (i < num)
	{
		if (src[i] == del)
		{
			i++;
			sz--;
		}
		else
			dest[j++] = src[i++];
	}
	//打印数组
	for (i = 0; i < sz; i++)
		printf("%d ", dest[i]);
}
int main()
{
	//输入数组元素个数
	int num = 0;
	scanf("%d", &num);
	//输入数组
	int arr[50] = { 0 };
	int i = 0;
	for (i = 0; i < num; i++)
	{
		scanf("%d", &arr[i]);
	}
	//输入需要删除的数
	int del = 0;
	scanf("%d", &del);
	//开始删除,并输出最终数组
	delete_num(arr, num, del);
	return 0;
}

在这里插入图片描述

  上面的代码可以达成目的,但这样做的缺点是会另外多开辟一块空间。


解法2:覆盖法

  在遍历整个序列时若发现需要删除的元素,则将后面所有的元素向前覆盖一位,这样可以达到最终目的。值得注意,在遍历的时候可能存在重复连续的整数,所以每次找到需要删除的元素后,最好是在删除位置重新往后遍历。如下图所示:

在这里插入图片描述

#include<stdio.h>
void delete_num(int arr[], int num, int del)
{
	//删除数字
	int cur = 0;
	while (cur < num)
	{
		if (arr[cur] != del)
			cur++;
		else
		{
			int i = 0;
			for (i = cur; i < num - 1; i++)
				arr[i] = arr[i + 1];
			num--;
		}
	}
	//打印数组
	int i = 0;
	for (i = 0; i < num; i++)
		printf("%d ", arr[i]);
}

int main()
{
	//输入数组元素个数
	int num = 0;
	scanf("%d", &num);
	//输入数组
	int arr[50] = { 0 };
	int i = 0;
	for (i = 0; i < num; i++)
	{
		scanf("%d", &arr[i]);
	}
	//输入需要删除的数
	int del = 0;
	scanf("%d", &del);
	//开始删除,并输出最终数组
	delete_num(arr, num, del);
	return 0;
}

在这里插入图片描述

  上面的代码大大增加了算法的复杂度,原因是使用了两个for循环嵌套。


解法3:覆盖法(进阶版)

  解法2中的覆盖法过于繁琐,需要多次重复遍历数组。那么存不存在一种只需要遍历一遍数组解法?答:覆盖法(进阶版)。解题思路:通过两个遍历速度不同的下标交错覆盖,实现删除数字的目的。如下图所示:

在这里插入图片描述

#include<stdio.h>
void delete_num(int arr[], int num, int del)
{
	int before = 0;
	int after = 0;
	int sz = num;
	//删除数字
	while (before < num)
	{
		if (arr[before] != del)
			arr[after++] = arr[before++];
		else
		{
			before++;
			sz--;
		}
	}
	//打印数组
	int i = 0;
	for (i = 0; i < sz; i++)
		printf("%d ", arr[i]);
}

int main()
{
	//输入数组元素个数
	int num = 0;
	scanf("%d", &num);
	//输入数组
	int arr[50] = { 0 };
	int i = 0;
	for (i = 0; i < num; i++)
	{
		scanf("%d", &arr[i]);
	}
	//输入需要删除的数
	int del = 0;
	scanf("%d", &del);
	//开始删除,并输出最终数组
	delete_num(arr, num, del);
	return 0;
}

在这里插入图片描述


解法4:异或取巧法

  异或取巧法解题思路:使用'^'(异或操作符)对序列中所有元素异或上需要被删除的那个数,这样序列中所有需要被删除的数就会变为0。再将那些没有变为0的数异或上需要被删除的那个数,这些数就变回原先的数值。异或的两个特性:

  1. 相同数值进行异或,结果必为0
  2. 任意数值与0进行异或,结果必为该数本身
#include<stdio.h>
void delete_num(int arr[], int num, int del)
{
	int i = 0;
	for (i = 0; i < num; i++)
	{
		arr[i] ^= del;
	}
	for (i = 0; i < num; i++)
	{
		if (arr[i] != 0)
			printf("%d ", arr[i] ^ del);
	}
}

int main()
{
	//输入数组元素个数
	int num = 0;
	scanf("%d", &num);
	//输入数组
	int arr[50] = { 0 };
	int i = 0;
	for (i = 0; i < num; i++)
	{
		scanf("%d", &arr[i]);
	}
	//输入需要删除的数
	int del = 0;
	scanf("%d", &del);
	//开始删除,并输出最终数组
	delete_num(arr, num, del);
	return 0;
}

在这里插入图片描述


在这里插入图片描述

这份博客👍如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位🔎点赞👍评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧👀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/906550.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

百度文心一言接入流程-java版

百度文心一言接入流程-java版 一、准备工作二、API接口调用-java三、百度Prompt工程参考资料: 百度文心一言:https://yiyan.baidu.com/百度千帆大模型:https://qianfan.cloud.baidu.com/百度千帆大模型文档:https://cloud.baidu.com/doc/WENXINWORKSHOP/index.html千tokens…

【深度学习】实验 — 动手实现 GPT【三】:LLM架构、LayerNorm、GELU激活函数

【深度学习】实验 — 动手实现 GPT【三】&#xff1a;LLM架构、LayerNorm、GELU激活函数 模型定义编码一个大型语言模型&#xff08;LLM&#xff09;架构 使用层归一化对激活值进行归一化LayerNorm代码实现scale和shift 实现带有 GELU 激活的前馈网络测试 模型定义 编码一个大…

《YOLO 目标检测》—— YOLO v4 详细介绍

文章目录 一、整体网络结构1. YOLO v4 网络结构图2.对之前版本改进创新的概括 二、对改进创新部分的具体介绍1. 输入端创新2. Backbone主干网络创新CSPDarknet53Mish激活函数Dropblock正则化 3. 特征融合创新SPP模块PAN结构 4. Prediction输出层创新&#xff08;未写完&#xf…

LinkedList 源码分析

1. 迭代器Iterator 在 Java 中&#xff0c;Iterator&#xff08;迭代器&#xff09;是一个用于遍历集合元素的接口。它提供了一种统一的方式来访问集合中的元素&#xff0c;而不需要了解集合的内部实现细节。 一、主要方法 hasNext()&#xff1a;判断是否还有下一个元素可遍历…

怎么安装行星减速电机才是正确的

行星减速电机由于其高效、精密的传动能力&#xff0c;广泛应用于自动化设备、机器人、机床以及其他需要精准控制的领域。正确的安装行星减速电机对于确保设备的性能与延长使用寿命至关重要。 一、前期准备 在进行行星减速电机的安装之前&#xff0c;必须做好充分的前期准备工作…

springcloud通过MDC实现分布式链路追踪

在DDD领域驱动设计中&#xff0c;我们使用SpringCloud来去实现&#xff0c;但排查错误的时候&#xff0c;通常会想到Skywalking&#xff0c;但是引入一个新的服务&#xff0c;增加了系统消耗和管理学习成本&#xff0c;对于大型项目比较适合&#xff0c;但是小的项目显得太过臃…

SAP RFC 用户安全授权

一、SAP 通讯用户 对于RFC接口的用户&#xff0c;使用五种用户类型之一的“通讯”类型&#xff0c;这种类型的用户没有登陆SAPGUI的权限。 二、对调用的RFC授权 在通讯用户内部&#xff0c;权限对象&#xff1a;S_RFC中&#xff0c;限制进一步可以调用的RFC函数授权&#xff…

Spring IoC——依赖注入

1. 依赖注入的介绍 DI&#xff0c;也就是依赖注入&#xff0c;在容器中建立的 bean &#xff08;对象&#xff09;与 bean 之间是有依赖关系的&#xff0c;如果直接把对象存在 IoC 容器中&#xff0c;那么就都是一个独立的对象&#xff0c;通过建立他们的依赖关系&#xff0c;…

IDEA连接EXPRESS版本的SQL server数据库

我安装的版本是SQL2019-SSEI-Expr.exe 也就是EXPRESS版本的SQL Server安排非常简单和快速。 但是默认没有启动sa用户。 启动sa用户名密码登录 默认安装完以后没有启用。 使用Miscrosoft SQL Server Management Studio 使用Windows身份连接后。 在安全性》登录名中找到sa并修改…

​Java面试经典 150 题.P13. 罗马数字转整数(012)​

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int romanToInt(String s) {int sum…

大数据-204 数据挖掘 机器学习理论 - 混淆矩阵 sklearn 决策树算法评价

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Windows11下将某个程序添加到鼠标右键快捷菜单

经常看log&#xff0c;最喜欢用的txt查看和编辑工具是EditPlus&#xff0c;好像是个韩国软件&#xff0c;最大的优势是打开大文件&#xff0c;好几G的log文件也很轻松&#xff0c;速度快&#xff0c;然后还有各种高亮设置查找文件等&#xff0c;非常方便。但是不知道为什么&…

宏处理将多个excel文件的指定sheet页合并到一个excel文件中

背景了解&#xff1a;有个同事问我&#xff1a;现在他要处理一千多个文件&#xff0c;每个excel文件都有3个sheet页签&#xff0c;想把所有的excel文件的第二个sheet页签复制一份放到一个新的excel文件中。如果是手动去操作一个个文件的复制&#xff0c;也没什么不可&#xff0…

什么是散度,什么是旋度,分别反映什么现象,磁场和静电场分别是什么场?

散度和旋度是矢量场中重要的微分运算概念&#xff0c;用来描述矢量场的局部特性&#xff0c;广泛应用于物理学、流体力学和电磁学中。 1. 散度&#xff08;Divergence&#xff09; 散度描述的是一个矢量场在某一点的“发散”或“汇聚”程度&#xff0c;简单来说就是在该点附近…

web——warmup——攻防世界

这道题还是没有做出来。。&#xff0c;来总结一下 1.ctrlU显示源码 2.看见body里有source.php 打开这个source.php 看见了源码 highlight_file(FILE); 这行代码用于高亮显示当前文件的源码&#xff0c;适合调试和学习&#xff0c;但在生产环境中通常不需要。 class emmm 定义…

vue3项目history模式部署404处理,使用 historyApiFallback 中间件支持单页面应用路由

vue3项目history模式部署404处理&#xff0c;使用 historyApiFallback 中间件支持单页面应用路由 在现代的 web 开发中&#xff0c;单页面应用&#xff08;SPA&#xff09;变得越来越流行。这类应用通常依赖于客户端路由来提供流畅的用户体验&#xff0c;但在服务器端&#xf…

跨境电商平台系统开发

随着全球化的不断深入&#xff0c;跨境电商作为新兴的商业模式&#xff0c;越来越受到企业和消费者的关注。跨境电商平台的系统开发不仅涉及技术层面的挑战&#xff0c;更涉及到法律、物流、支付等多方面的因素。商淘云将分享跨境电商平台系统开发的主要环节&#xff0c;包括需…

《Web性能权威指南》-WebRTC-读书笔记

本文是《Web性能权威指南》第四部分——WebRTC的读书笔记。 第一部分——网络技术概览&#xff0c;请参考网络技术概览&#xff1b; 第二部分——无线网络性能&#xff0c;请参考无线网络性能&#xff1b; 第三部分——HTTP&#xff0c;请参考HTTP&#xff1b; 第四部分——浏览…

.NET 8 Web API 中的身份验证和授权

本次介绍分为3篇文章&#xff1a; 1&#xff1a;.Net 8 Web API CRUD 操作.Net 8 Web API CRUD 操作-CSDN博客 2&#xff1a;在 .Net 8 API 中实现 Entity Framework 的 Code First 方法https://blog.csdn.net/hefeng_aspnet/article/details/143229912 3&#xff1a;.NET …

android定时器循环实现轮播图

说明&#xff1a; android定时器加for循环实现轮播图 效果&#xff1a; step1: package com.example.iosdialogdemo;import android.os.Bundle; import android.os.Handler; import android.widget.ImageView; import android.widget.TextView;import androidx.appcompat.ap…