C语言之找单身狗

个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-CSDN博客

题目: 

在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。

例如:

数组中有:1 2 3 4 5 1 2 3 4,只有5出现一次,其他数字都出现2次,找出5

 这个题目说难也难,说容易也容易,主要是看能不能想到。这个题目是让我们在相同中找不同(只有5是出现一次,其他数字都出现2次,找出5),就可以想到一个操作符按位异或(^),同为0,异为1。不过这里有一个知识点:0 ^ n = n    n ^ n = 0。这个题目在下面这篇文章中讲过,可以去看看。                     

 利用操作符解题的精彩瞬间-CSDN博客

题目: 

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。

编写一个函数找出这两个只出现一次的数字。

例如:

有数组的元素是:1,2,3,4,5,1,2,3,4,6

只有5和6只出现1次,要找出5和6.

如果我们还用异或的方法,就会发现这个结果不是我们想要的。但是这个思想还是用异或的方法。因为这个题目还是找不同,只不过是多了一个数,并且要全部输出。但是如果我们把这个数组分为两个数组,每个数组中都只有一个数出现一次,然后再用上面的方法:异或 ,得出结果,分别输出。我们现在就是要找到这个分组的依据,如果根据这个例子,我们就会发现可以用奇偶的方法把这两个不同的数个分开。

#include <stdio.h>
void FindNum(int* p, int sz)
{int num1 = 0;int num2 = 0;int i = 0;for (i = 0; i < sz; i++){if (*(p+i) % 2 == 1){num1 ^= *(p + i);}else{num2 ^= *(p + i);}}printf("%d %d\n", num1, num2);
}int main()
{int arr[] = { 1,2,3,4,5,6,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);FindNum(arr, sz);return 0;
}

当然这个方法有局限性,只限于这两个出现一次的数,一个是奇数一个是偶数。如果两个都是奇数或者偶数不行。

这里还是用异或,将这个数组中的数全部异或到一起,把最终的结果转化为二进制。看看二进制中的1,随机选一个1,作为异或的结果。画图演示:

我们把倒数第二位的1作为分界限。把这个位是1的分成一组,是0的分成1组。当然这里可能会有小伙伴有疑惑:这个1,只是把5和6分开了,但是那些其它的数字呢?其实这里我们的目的从一开始就是要把5和6分开就行了。因为那些数都是一对的,不管是前面的奇偶性,还是二进制位都是一样的,我们分开了一个,另外一个也会跟着走。 

#include <stdio.h>
void FindNum(int* p, int sz)
{//第一步把全部的数异或到一起,得出最终的结果int ret = 0;int i = 0;for (i = 0; i < sz; i++){ret ^= *(p + i);}//将ret的一个二进制位1,作为分界线,1是一组,0是一组int num1 = 0;int num2 = 0;for (i = 0; i < sz; i++){//ret >> 1就是把倒数第二位的二进制位移到倒数第一位(只有这样才能判断是否为1)//(*(p + i))) >> 1 就是和上面一样的效果。if( ((ret >> 1) & ((*(p + i))) >> 1 )== 1){num1 ^= *(p + i);}else{num2 ^= *(p + i);}}printf("%d\n", num1);printf("%d\n", num2);
}int main()
{int arr[] = { 1,2,3,4,5,6,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);FindNum(arr, sz);return 0;
}

但是这个代码也是有缺陷的,只能把倒数第二位的找出(就像5和6)。如果要推广的话,就不可以,除非我们把那个异或的数的第K位为1找出来,移到想要的位数来比较。得到K的值

#include <stdio.h>
void FindNum(int* p, int sz)
{//第一步把全部的数异或到一起,得出最终的结果int ret = 0;int i = 0;for (i = 0; i < sz; i++){ret ^= *(p + i);}//将ret的一个二进制位1,作为分界线,1是一组,0是一组//接下来就是找这个1。int k = 0;for (i = 0; i < 32; i++)//最坏的结果就是找32次{if (((ret >> i) & 1) == 1)//最低位为1,则说明是1{k = i;break;}}int num1 = 0;int num2 = 0;for (i = 0; i < sz; i++){//i >> k就是把i的二进制位移了k位,看看与1的结果,如果是1,则说明该位是1if( (((*(p + i)) >> k) & 1) == 1){num1 ^= *(p + i);}else{num2 ^= *(p + i);}}printf("%d\n", num1);printf("%d\n", num2);
}int main()
{int arr[] = { 1,2,3,4,5,6,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);FindNum(arr, sz);return 0;
}

这里就是可以任意找了。注意一下:在判断数组元素与1的结果是否为1时,要把括号加上去,阐明优先运算。 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于微信小程序的医保行政执法案件管理系统

本系统设计的是一个医保行政执法的网站&#xff0c;此网站使用户实现了不需出门就可以在手机或电脑前进行网上查询需求信息等。 用户在注册登陆后&#xff0c;在客户端可以实现&#xff1b;案件信息、结案归档、我的等。然而管理员则可以在服务端直接管理&#xff1b;个人中心、…

H12-821_28

28.如图所示,在一个纯IPv6环境中,若想实现PC1与PC2之间的通信,下列哪组地址可以分别配置在PC1与P2上 A.2001:FDC:1/64 2001:FDC::2/64 B.2001:FDC::1/64 2001:FDC1::2/64 C.FD00:1AC0:872E::1/64 FD00:2BE1:2320::1/64 D.FE80::1/64 FE80::2/64 答案&#xff1a;B 注释&…

少儿编程考级:智慧启迪还是智商税?

在当前科技日新月异的时代背景下&#xff0c;少儿编程教育日益受到家长和社会的广泛关注。与此同时&#xff0c;各类少儿编程考级应运而生&#xff0c;引发了公众对于其价值和意义的深度探讨。一部分人认为这是对孩子逻辑思维与创新能力的有效锻炼&#xff0c;是智慧启迪的重要…

深入解析Elasticsearch的内存架构与管理

在当今数据驱动的世界中&#xff0c;高效、快速地处理和搜索大量数据成为了许多应用的核心需求。Elasticsearch&#xff0c;作为一款功能强大的开源搜索和分析引擎&#xff0c;通过其独特的内存架构和管理策略&#xff0c;实现了对大规模数据集的快速索引和查询。本文将深入解析…

推理系统学习笔记

一些学习资料 最近对MLsys比较感兴趣&#xff0c;遂找些资料开始学习一下 https://fazzie-key.cool/2023/02/21/MLsys/https://qiankunli.github.io/2023/12/16/llm_inference.htmlhttps://dlsyscourse.orghttps://github.com/chenzomi12/DeepLearningSystem/tree/main/04Infe…

最详细PE文件格式讲解(完结篇)

前提情要&#xff1a;各位小伙伴是否已经熟练掌握前半部分知识点&#xff0c;各位可以找一下相关练习&#xff0c;或者等待我下面会发布的代码实践进行练习&#xff0c;如果一切ok&#xff0c;那我们将开始下半部分学习&#xff08;good&#xff09;。 如果还没有看&#xff0c…

【学习笔记】TypeScript学习笔记1 --TypeScript中的类型

文章目录 TS总的变量类型References TS总的变量类型 备注&#xff1a; 如果一个变量设置为了any 类型之后相当于变量关闭了TS的类型检测 let d: any; d 10; d hello;//unknown表示的是未知类型&#xff0c;实际是上一个安全的any,unknown类型的变量不能直接赋值给其他变量le…

docker部署docker运维工具

简介 主要功能:管理容器,管理镜像,管理容器网络 安装 拉取镜像 docker pull joinsunsoft/docker.ui:1.0.1 启动容器 docker run -d --name docker.ui --restart always -v /var/run/docker.sock:/var/run/docker.sock -p 10039:8999 joinsunsoft/docker.ui:1.0.1 使用 打…

汇集全球50+供应链领域企业专家,创新论坛带来最新趋势和实践

过去的几年中&#xff0c;随着世界范围内经济、社会和政治上的巨大变化&#xff0c;供应链管理已成为企业和经济成功的关键因素。面对不断增长的全球挑战&#xff0c;包括经济波动、技术变革、政治不确定性&#xff0c;以及环境可持续性的压力&#xff0c;构建一个创新、高效且…

[leetcode] 29. 两数相除

文章目录 题目描述解题方法倍增java代码复杂度分析 题目描述 给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分…

惟客数据地产经营分析解决方案-构建数字化经营体系,提高精细化管理能力

惟客数据地产经营分析解决方案以拉通数据底座&#xff0c;以管理行为、量化考核、预警机制为核心&#xff0c;强化对经营风险的识别和解决&#xff0c;以终为始&#xff0c;通过高频高价值场景的应用适配&#xff0c;支撑企业在数字化时代中不断创新、转型&#xff0c;提升企业…

【SpringBoot篇】解决Redis分布式锁的 误删问题 和 原子性问题

文章目录 &#x1f354;Redis的分布式锁&#x1f6f8;误删问题&#x1f388;解决方法&#x1f50e;代码实现 &#x1f6f8;原子性问题&#x1f339;Lua脚本 ⭐利用Java代码调用Lua脚本改造分布式锁&#x1f50e;代码实现 &#x1f354;Redis的分布式锁 Redis的分布式锁是通过利…