如何用位运算求出数组中两个不等的出现奇数次的数字?

这篇博客介绍了如何使用位运算找到一个整型数组中两个不相等且出现奇数次的数字。通过分析异或运算的性质,提出了三种思路:直接异或所有元素得到两个奇数次数字的异或结果;根据异或结果的最右边的1进行分类;以及通过将数字取负与最右边的1进行与运算进行分类。文章提供了详细的操作步骤和代码示例。
摘要由CSDN通过智能技术生成

目录

前言

一、简化分析问题

 简单问题的思路

2、问题升级

如何用位运算求出数组中两个不同的出现奇数次的数字?

 思路1:

 思路2:       

 思路3:

总结


前言

        大家首先来了解一下今天要讲解的问题:一个整型数组 nums 里除两个不等数字之外,其他数字都出现了偶数次。请运用位运算写程序找出这两个不等的只出现奇数的数字。本篇问题涉及到位运算的相关知识,其中涉及到对位运算的内容不太熟悉大家可进入以下网址温故一下。https://blog.csdn.net/qq_57985909/article/details/119154619

        本篇博客参考网址:剑指 Offer 56 - I. 数组中数字出现的次数(位运算,清晰图解) - 数组中数字出现的次数 - 力扣(LeetCode) (leetcode-cn.com)

一、简化分析问题

       与题目类似的简单情况为一个整型数组 nums 里除 一个 数字之外,其他数字都出现了两次。

设整型数组 nums中出现一次的数字为 x ,出现两次的数字为 a, b, ...a,b,... ,即:

nums = [a, a, b, b, ..., x]

       使用位运算的思路来解决这个问题,不难想到利用异或的特殊性质。

1、交换律 a^b=b^a
2、结合律 (a^b)^c == a^(b^c)
3、两个相同数字异或为 0 对于任何数x,都有 x^x=0,x^0=x                  

4、自反性:a^b^b=a^0=a;
5、求二进制数n最左边(高位)等于 1 的那一位表示的数
      需要使用n带入公式- - - - -n&n-1
      得到结果中如果不只一个1则将结果继续带入公式 - - - - -n&n-1
      知道结果中只有一位为1
6、求二进制数n最右边(低位)等于 1 的那一位表示的数
      只需要使用公式- - - - -n&(~n+1)

 简单问题的思路

       根据异或的交换律、结合律、自反性。易理解,将数组中的每个数从第一个开始与后面的数相互异或,最终会得的结果就是只出现了一次的那一个数字。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值