找出数组里的两个单身狗(异或的方法)

简介: 找出数组里的两个单身狗(异或的方法)

题目描述

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

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

例如:

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

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

今天我们就用异或的方法来解决这个问题

首先我们来了解一下异或的使用方法

异或在C语言中是按二进制的原码进行按位的操作:

例如:

1^2的结果是3

1的二进制:00000000 00000000 00000000 00000001
2的二进制:00000000 00000000 00000000 00000010
异或操作  :00000000 00000000 00000000 00000011

这样我们就可以发现一个规律:

1:0与任何数字异或都等于那个数的本身
2:两个相同的数异或等于0

在之前的学习中我们可能遇到过找出数组中一个单身狗的问题,我们首先也来用异或解决这个问题

异或找一个单身狗

按照异或的规律,我们可以用以下的代码实现找出数组中只出现一次的一个数字:

首先定义一个数ret为0,让它和数组中的每一个元素进行异或操作,最后得到的就是数组中只出现一次的数字(sz为数组的元素个数)。

int find_one_number(int* arr, int sz)
{
  int i = 0;
  int ret = 0;
  for (i = 0; i < sz; i++)
  {
    ret = ret ^ arr[i];
  }
  return ret;
}

例如:

数组为1,1,2,2,3,4,4

0^1=1 --> 1^1=0 --> 0^1=1 --> 1^1=0 --> 0^2=2 --> 2^2=0 --> 0^3=3 -->  3^4^4 = 3^0 = 3

异或找两个单身狗

下面我们就来找两个单身狗的数组:

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

我们在了解了找一个单身狗的异或的解法后在这里就更加容易的理解了

首先我们同样将整个数组异或:

这个时候返回值ret就是两个只出现一次的数组的按位异或之后的值

int find_one_number(int* arr, int sz)
{
  int i = 0;
  int ret = 0;
  for (i = 0; i < sz; i++)
  {
    ret = ret ^ arr[i];
  }
  return ret;
}

然后我们再找出两个只出现一次的数异或之后的二进制位不同位的位置,将数组分为两个数组:

在进行异或,就能分别得出两个单身狗了!

找到有分歧的二进制位pos,并记录其位置

int pos;
 for (i = 0; i < 32; i++)
 {
  if ( ( ret >> i ) & 1 )
  //如果右移出来的这一位&1不等于0,那么这一位就是1
  {
   pos = i;
   break;
  }
 }

例如1 2 3 4 1 2,异或完的结果应该是3^4得到的111,那么随便找一位就行了。例如找最低位,那么这一位是1的有1 3 1,是0的有2 4 2,由于是利用异或结果为1的某一位分的组,所以两个待查询数字一定分别在两组中。所以再找两个变量,分别异或两组数,即可找到这两个数

pnum1用于异或末位为1的数字,pnum2用于异或末位为2的数字

最后得出的pnum1就是末位为1的单身狗,pnum2就是末位为0的单身狗

*pnum1 = *pnum2 = 0;
 for (i = 0; i < sz; i++)
 {
  if ( ( arr[i]  >> pos ) & 1)//右移pos位得到的&1如果不等于0就是末位为1
  {
   *pnum1 ^= arr[i]; //将末位为1的异或
  }
  else
  {
   *pnum2 ^= arr[i]; //将末位为0的异或
  }
 }
}

完整代码如下:

void find_one_number(int* arr, int sz, int * pnum1, int * pnum2)
{
 int i = 0;
 int ret = 0;
 for (i = 0; i < sz; i++)
 {
  ret ^= arr[i];
 } 
 int pos;
 for (i = 0; i < 32; i++)
 {
  if ( ( ret >> i )  & 1 )
  {
   pos = i;
   break;
  }
 } 
 *pnum1 = *pnum2 = 0;
 for (i = 0; i < sz; i++)
 {
  if ( ( arr[i]  >> pos) & 1)
  {
   *pnum1 ^= arr[i]; 
  }
  else
  {
   *pnum2 ^= arr[i]; 
  }
 }
}

好了,今天的分享到这里就结束了,谢谢大家的支持!

相关文章
|
8天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
3535 34
|
7天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
|
3天前
|
云安全 人工智能 安全
|
8天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1606 6
|
8天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
|
云安全 安全 网络安全
|
21天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
3761 55
|
13天前
|
人工智能 JSON Linux
【保姆级】ComfyUI部署教程(下载+安装+配置+工作流,2026最新)
ComfyUI 是一款开源节点式AI生成工具,支持图像、视频、音频及3D内容创作。通过拖拽连线组合模型加载、提示词、采样等节点,构建可复用、易修改的工作流,兼容SD1.5、SDXL、Flux、Qwen Image等主流模型。