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

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时,要把括号加上去,阐明优先运算。 

相关文章:

  • java SpringBoot2.7整合Elasticsearch(ES)7 进行文档增删查改
  • linux 生成 ca 证书
  • 体悟PyTorch的优雅
  • 毫无基础的人如何入门 Python ?
  • 十分钟GIS——geoserver+postgis+udig从零开始发布地图服务
  • hadoop使用公平调度器
  • 包装组件的优点和可能的挑战
  • 鸿蒙开发系列教程(十六)--日志处理
  • B2052 简单计算器(洛谷)
  • Vue3快速上手(二)VSCode官方推荐插件安装及配置
  • IDEA 推荐插件
  • 苹果macbook电脑删除数据恢复该怎么做?Mac电脑误删文件的恢复方法
  • 天线阵列车载应用——第1章 介绍 1.1节 汽车工业中的天线阵列:应用和频率范围
  • android下library打包aar并上传到maven,嵌入版的app
  • 爬虫笔记(三):实战qq登录
  • angular组件开发
  • Bytom交易说明(账户管理模式)
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • C++类的相互关联
  • co.js - 让异步代码同步化
  • ES6系统学习----从Apollo Client看解构赋值
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • MYSQL 的 IF 函数
  • Vue 动态创建 component
  • 从0到1:PostCSS 插件开发最佳实践
  • 构造函数(constructor)与原型链(prototype)关系
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端js -- this指向总结。
  • 双管齐下,VMware的容器新战略
  • 阿里云服务器如何修改远程端口?
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • (1)(1.13) SiK无线电高级配置(五)
  • (c语言)strcpy函数用法
  • (C语言)字符分类函数
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (原)本想说脏话,奈何已放下
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (状压dp)uva 10817 Headmaster's Headache
  • ******之网络***——物理***
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core 控制台应用程序读取配置文件app.config
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @Query中countQuery的介绍
  • [ JavaScript ] JSON方法
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——