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

探寻数组中两个不重复数字的奥秘:C 语言实战之旅


在编程的世界里,经常会遇到各种各样有趣的问题,今天我们就来探讨一个经典的题目:在一个整数数组中,除了两个数字只出现一次,其余数字都出现了两次,如何高效地找出这两个只出现一次的数字呢?我们将使用 C 语言来解决这个问题,并通过详细的代码分析来深入理解其中的原理。

目录

一、问题分析 

二、代码实现与解析 

函数 fingdog 解析 

第一步:整体异或

第二步:定位关键位

第三步:分组异或

main 函数解析 

三、拓展与思考 


 

 

一、问题分析
 

这个问题的核心在于如何利用数组元素的特性,通过巧妙的算法来区分出那两个独特的数字。我们知道,异或运算( ^ )有一些非常有用的性质:任何数和 0 做异或运算,结果仍然是这个数;任何数和自身做异或运算,结果为 0;异或运算满足交换律和结合律。这就为我们解决问题提供了思路。
 

二、代码实现与解析
 

我们来看下面这段 C 语言代码:
 

c#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>// 用于找出数组中两个只出现一次的数字的函数
void fingdog(int arr1[], int sz, int arr2[]) {int ret = 0;// 第一步:对数组中所有元素进行异或操作for (int i = 0; i < sz; i++) {ret ^= arr1[i];}int pos = 0;// 第二步:找到异或结果中为 1 的最低位for (int i = 0; i < 32; i++) {if (((ret >> i) & 1) == 1) {pos = i;break;}}// 第三步:根据找到的位对数组元素进行分组异或for (int j = 0; j < sz; j++) {if (((arr1[j] >> pos) & 1) == 1) {arr2[0] ^= arr1[j];} else {arr2[1] ^= arr1[j];}}
}int main() {int arr1[] = { 1,2,3,4,5,1,2,3,4,6 };int sz = sizeof(arr1) / sizeof(arr1[0]);int arr2[2] = { 0 };fingdog(arr1, sz, arr2);printf("%d %d", arr2[0], arr2[1]);return 0;
}

函数 fingdog 解析
 

第一步:整体异或

我们定义了变量 ret 并初始化为 0,然后通过一个 for 循环遍历数组 arr1 ,将每个元素与 ret 进行异或运算。由于出现两次的数字异或后结果为 0,所以最终 ret 的值就是那两个只出现一次的数字的异或结果。

第二步:定位关键位

得到 ret 后,我们需要找到它二进制表示中为 1 的最低位。通过一个 for 循环,从右向左依次检查 ret 的每一位,当找到为 1 的位时,记录下它的位置 pos 。这个位的作用是将数组中的元素分成两组,一组该位为 1,另一组该位为 0,而那两个只出现一次的数字必然分别在这两组中。
 

第三步:分组异或

再次遍历数组 arr1 ,根据每个元素在 pos 位上的值进行分组异或。如果元素在 pos 位上为 1,则与 arr2[0] 异或;如果为 0,则与 arr2[1] 异或。这样,两组中出现两次的数字又会相互抵消,最终 arr2[0] 和 arr2[1] 就分别存储了那两个只出现一次的数字。
 

main 函数解析
 

在 main 函数中,我们定义了测试数组 arr1 ,计算其长度 sz ,并初始化用于存储结果的数组 arr2 。然后调用 fingdog 函数进行处理,最后输出结果。
 

三、拓展与思考
 

这个问题的解决方法不仅仅局限于当前的场景。从更广泛的角度看,异或运算在数据加密、错误检测等领域都有重要的应用。通过这个例子,我们可以进一步思考如何优化算法的时间复杂度和空间复杂度,比如在处理大规模数据时,如何减少不必要的计算和内存占用。
 

同时,这个问题也可以进行一些变体,例如数组中除了三个数字只出现一次,其余数字都出现两次,又该如何解决呢?这就需要我们在现有知识的基础上,进一步探索和创新算法。
 
在编程的道路上,每一个看似简单的问题背后都隐藏着无尽的知识和技巧。通过不断地实践和思考,我们才能提升自己的编程能力,更好地应对各种复杂的挑战。希望今天的分享能对你有所启发,让我们一起在代码的世界里继续探索前行!

 

相关文章:

探寻数组中两个不重复数字的奥秘:C 语言实战之旅

在编程的世界里&#xff0c;经常会遇到各种各样有趣的问题&#xff0c;今天我们就来探讨一个经典的题目&#xff1a;在一个整数数组中&#xff0c;除了两个数字只出现一次&#xff0c;其余数字都出现了两次&#xff0c;如何高效地找出这两个只出现一次的数字呢&#xff1f;我们…...

Mercury、LLaDA 扩散大语言模型

LLaDA 参考&#xff1a; https://github.com/ML-GSAI/LLaDA https://ml-gsai.github.io/LLaDA-demo/ 在线demo&#xff1a; https://huggingface.co/spaces/multimodalart/LLaDA Mercury 在线demo&#xff1a; https://chat.inceptionlabs.ai/ 速度很快生成...

【ESP32S3接入讯飞在线语音识别】

视频地址: 【ESP32S3接入讯飞在线语音识别】 1. 前言 使用Seeed XIAO ESP32S3 Sense开发板接入讯飞实现在线语音识别。自带麦克风模块用做语音输入,通过串口发送字符“1”来控制数据的采集和上传。 语音识别对比 平台api教程评分百度...

深入了解 SSH 及其相关协议

深入了解 SSH 及其相关协议 在网络通信的世界里&#xff0c;安全始终是至关重要的话题。SSH&#xff08;Secure Shell&#xff09;作为一种广泛应用的网络协议&#xff0c;为我们在不安全的网络环境中提供了安全的远程连接和数据传输方式。今天&#xff0c;就让我们一起来深入…...

微信小程序源码逆向 MacOS

前言 日常工作中经常会遇到对小程序的渗透测试&#xff0c;微信小程序的源码是保存在用户客户端本地&#xff0c;在渗透的过程中我们需要提取小程序的源码进行问题分析&#xff0c;本篇介绍如何在苹果电脑 MacOS 系统上提取微信小程序的源码。 0x01 微信小程序提取 在苹果电…...

【我的 PWN 学习手札】House of Husk

House of Husk House of Husk是利用格式化输出函数如printf、vprintf在打印输出时&#xff0c;会解析格式化字符如%x、%lld从而调用不同的格式化打印方法&#xff08;函数&#xff09;。同时C语言还提供了注册自定义格式化字符的方法。注册自定义格式化字符串输出方法&#xf…...

(八)趣学设计模式 之 装饰器模式!

目录 一、 啥是装饰器模式&#xff1f;二、 为什么要用装饰器模式&#xff1f;三、 装饰器模式的实现方式四、 装饰器模式的优缺点五、 装饰器模式的应用场景六、 装饰器模式 vs 代理模式七、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢…...

设计后端返回给前端的返回体

目录 1、为什么要设计返回体&#xff1f; 2、返回体包含哪些内容&#xff08;如何设计&#xff09;&#xff1f; 举例 3、总结 1、为什么要设计返回体&#xff1f; 在设计后端返回给前端的返回体时&#xff0c;通常需要遵循一定的规范&#xff0c;以确保前后端交互的清晰性…...

Element Plus中el-select选择器的下拉选项列表的样式设置

el-select选择器&#xff0c;默认样式效果&#xff1a; 通过 * { margin: 0; padding: 0; } 去掉内外边距后的样式效果&#xff08;样式变丑了&#xff09;&#xff1a; 通过 popper-class 自定义类名修改下拉选项列表样式 el-select 标签设置 popper-class"custom-se…...

C高级(shell)

作业 1、使用case...in实现等级判断 2、计算各个位数和 3、计算家目录下目录个数和普通文件数 4、打印图形 5、冒泡排序...

子宫腺肌症是如果引起的?

子宫腺肌症是一种常见的妇科疾病&#xff0c;它是指子宫内膜的腺体和间质侵入子宫肌层形成的一种病症。那么&#xff0c;子宫腺肌症是如何引起的呢&#xff1f; 一、病因分析 子宫腺肌症的确切病因目前尚不十分清楚&#xff0c;但经过医学研究和临床观察&#xff0c;认为其发…...

网络安全学习中,web渗透的测试流程是怎样的?

渗透测试是什么&#xff1f;网络安全学习中&#xff0c;web渗透的测试流程是怎样的&#xff1f; 渗透测试就是利用我们所掌握的渗透知识&#xff0c;对网站进行一步一步的渗透&#xff0c;发现其中存在的漏洞和隐藏的风险&#xff0c;然后撰写一篇测试报告&#xff0c;提供给我…...

【软考】【2025年系统分析师拿证之路】【啃书】第十四章 软件实现与测试(十五)

目录 程序设计方法代码重用软件测试软件测试的对象和目的软件测试方法按照被测程序是否可见分类按照是否需要执行被测试程序分类自动测试 测试类型按测试对象划分按测试阶段划分按被测试软件划分其他分类 程序设计方法 结构化程序设计&#xff1a;自顶向下&#xff0c;逐步求精…...

自然语言处理NLP深探

1. NLP 的定义、特点、具体工作、历史和流派 定义:自然语言处理(Natural Language Processing,NLP)是计算机科学与人工智能领域的一个重要分支,旨在让计算机理解、处理和生成人类自然语言,实现人与计算机之间用自然语言进行有效通信。特点 交叉性:涉及计算机科学、语言学…...

加载互联网免费地图资源并通过CesiumEarth快速浏览

免费地图资源 地理信息系统&#xff08;GIS&#xff09;的搭建主要可分为两部分&#xff1a;1、三维地球引擎&#xff1b;2、基础数据图层。 CesiumEarth提供了可直接使用的三维地球引擎&#xff0c;因此只需准备基础数据图层&#xff0c;即可搭建属于自己的地理信息系统。 …...

Android 键盘输入按确认或换行 直接触发提交

在 Android 开发中&#xff0c;若要实现键盘输入时按下确认键&#xff08;如 “完成”“发送” 等&#xff09;或者换行键直接触发提交操作&#xff0c;可以通过以下几种方式实现&#xff0c;下面为你详细介绍。 方式一&#xff1a;使用 EditText 的 setOnEditorActionListene…...

halcon三维点云数据处理(二十七)remove_bin_for_3d_object_localization

目录 一、remove_bin_for_3d_object_localization代码第一部分二、remove_bin_for_3d_object_localization代码第二部分三、效果图一、remove_bin_for_3d_object_localization代码第一部分 1、读图构建3D模型。 2、一次二值化选取区域。 3、一次和背景差值选取区域。 4、在二维…...

XFeat:轻量级的深度学习图像特征匹配

一、引言&#xff1a;图像特征匹配的挑战与XFeat的突破 在计算机视觉领域&#xff0c;图像特征匹配是视觉定位&#xff08;Visual Localization&#xff09;、三维重建&#xff08;3D Reconstruction&#xff09;、增强现实&#xff08;AR&#xff09;等任务的核心基础。传统方…...

[MD] AG stable

当然&#xff0c;以下是A-stable和G-stable的详细定义&#xff1a; A-stable (A-稳定) A-stable是数值方法稳定性的一种分类&#xff0c;主要用于分析求解常微分方程初值问题的数值方法。一个数值方法被称为A-stable&#xff0c;如果它满足以下条件&#xff1a; 对于所有的步…...

微信小程序自定义导航栏实现指南

文章目录 微信小程序自定义导航栏实现指南一、自定义导航栏的需求分析二、代码实现1. WXML 结构2. WXSS 样式样式解析:3. JavaScript 逻辑三、完整代码示例四、注意事项与优化建议五、总结微信小程序自定义导航栏实现指南 在微信小程序开发中,默认的导航栏样式可能无法满足所…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...