目录
前言
大家首先来了解一下今天要讲解的问题:一个整型数组 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=x4、自反性:a^b^b=a^0=a;
5、求二进制数n最左边(高位)等于 1 的那一位表示的数
需要使用n带入公式- - - - -n&n-1
得到结果中如果不只一个1则将结果继续带入公式 - - - - -n&n-1
知道结果中只有一位为1
6、求二进制数n最右边(低位)等于 1 的那一位表示的数
只需要使用公式- - - - -n&(~n+1)
简单问题的思路
根据异或的交换律、结合律、自反性。易理解,将数组中的每个数从第一个开始与后面的数相互异或,最终会得的结果就是只出现了一次的那一个数字。