当前位置: 首页 > 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 逻辑三、完整代码示例四、注意事项与优化建议五、总结微信小程序自定义导航栏实现指南 在微信小程序开发中,默认的导航栏样式可能无法满足所…...

ComfyUI-Manager终极指南:3个核心功能彻底解决AI工作流管理难题

ComfyUI-Manager终极指南&#xff1a;3个核心功能彻底解决AI工作流管理难题 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable vari…...

微信小程序3D开发框架技术对比:XR-Frame与threejs-miniprogram

随着微信小程序逐步支持3D渲染与AR能力&#xff0c;开发者面临两个主要官方方案&#xff1a;自研的XR-Frame和适配Three.js的threejs-miniprogram。本文将从架构设计、渲染机制、功能集成、开发模式及适用场景等维度进行技术分析&#xff0c;为技术选型提供参考。一、XR-Frame&…...

ThinkPad开机报错0183/0253?别慌,手把手教你搞定EFI变量错误(附BIOS重置教程)

ThinkPad开机报错0183/0253&#xff1f;EFI变量错误全面解决方案当你按下ThinkPad的电源键&#xff0c;期待熟悉的开机画面时&#xff0c;屏幕上却突然跳出一串神秘代码——"0183: Bad CRC of Security Settings in EFI Variable"或"0253: EFI Variable Block D…...

Sora 2原生接入Unity 6.0:5步完成神经渲染管线嵌入,实测帧率提升47%(附GitHub认证插件)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Sora 2与Unity整合 Sora 2作为新一代AI视频生成引擎&#xff0c;其开放API设计天然支持与实时3D引擎的深度协同。Unity 2023.2版本通过URP&#xff08;Universal Render Pipeline&#xff09;与C# Job System提…...

终极免费方案:WandEnhancer完整解锁WeMod Pro功能快速指南

终极免费方案&#xff1a;WandEnhancer完整解锁WeMod Pro功能快速指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 你是否渴望享受WeMod Pro会员的所…...

文件-语言-系统:基础IO-2.0——IO重定向接口,语言层缓冲区,系统级缓冲区。内核级分析!

bit::Shadow✧(≖ ◡ ≖✿ 目录 重定向接口dup2() ">" ">>" "<" 函数原型 输出重定向1和2的使用 文件描述符表 ./a.out运行&#xff1a; "./a.out >"默认重定向是fd 1 合并标准输入输出 缓冲区 什么是缓冲…...

广州因特智能:AI视觉软硬结合,打破半导体检测装备“卡脖子”困境

【导语&#xff1a;广州因特智能科技孵化于西安电子科技大学广州研究院&#xff0c;专注用AI视觉技术解决工业场景的“卡脖子”检测难题&#xff0c;为半导体、光通信、新能源三大领域提供高端检测装备。】校地合作孵化&#xff0c;构建完整能力体系广州因特智能科技由西安电子…...

终极指南:5步快速掌握免费的3D点云标注工具labelCloud

终极指南&#xff1a;5步快速掌握免费的3D点云标注工具labelCloud 【免费下载链接】labelCloud A lightweight tool for labeling 3D bounding boxes in point clouds. 项目地址: https://gitcode.com/gh_mirrors/la/labelCloud 想要为自动驾驶、机器人视觉或3D目标检测…...

【云雾效果商业级交付标准】:基于Adobe Sensei图像雾度分析报告(N=1,247张MJ生成图),锁定雾浓度≤0.38的7个关键阈值参数

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;云雾效果商业级交付标准的定义与行业意义 云雾效果在现代数字体验中已超越视觉装饰范畴&#xff0c;成为空间感知建模、沉浸式交互与品牌情绪传达的核心媒介。商业级交付标准并非仅关注“是否可见雾气”…...

如何快速掌握MPC视频渲染器:面向初学者的完整教程

如何快速掌握MPC视频渲染器&#xff1a;面向初学者的完整教程 【免费下载链接】VideoRenderer Внешний видео-рендерер 项目地址: https://gitcode.com/gh_mirrors/vi/VideoRenderer 想要在Windows系统上获得影院级的视频播放体验吗&#xff1f;MPC…...