解决|由浅入深,解决三道[只出现一次的数]!( 二 )
例:
文章插图
我们通过上面的例子了解了异或运算,对应位相异时得 1,相同时得 0,那么某个数跟本身异或时,因为对应位都相同所以结果为 0 , 然后异或又满足交换律和结合律。则
题目代码:
文章插图
本题一共介绍了6种解题方法,肯定还有别的方法,欢迎大家讨论。大家可以在做题的时候一题多解。这样能大大提高自己解题能力。下面我们来看一下这些方法如何应用到其他题目上。
只出现一次的数Ⅱ
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
示例 1:
输入: [2,2,3,2]输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]输出: 99
题目很容易理解,刚才的题目是其他元素出现两次,目标元素出现一次,该题是其他元素出现三次,目标元素出现一次,所以我们完全可以借助上题的一些做法解决该题。
求和法
我们在上题中介绍了求和法的解题步骤,现在该题中其他元素都出现三次,我们的目标元素出现一次,所以我们利用求和法也是完全 OK 的。下面我们来看具体步骤吧。
1.通过遍历数组获取所有元素的和以及 HashSet 内元素的和。
2.(SumSet*3-SumNum)/ 2即可,除以 2 是因为我们减去之后得到的是 2 倍的目标元素。
注:这个题目中需要注意溢出的情况 。
题目代码:
文章插图
这个题目用 HashMap 和排序查找肯定也是可以的,大家可以自己写一下,另外我们在第一题中有个利用异或求解的方法,但是这个题目是出现三次,我们则不能利用直接异或来求解,那还有其他方法吗?
位运算
这个方法主要做法是将我们的数的二进制位每一位相加,然后对其每一位的和取余 ,我们看下面的例子。
文章插图
那么我们为什么要这样做呢?大家想一下,如果其他数都出现 3 次,只有目标数出现 1 次,那么每一位的 1 的个数无非有这2种情况,为 3 的倍数(全为出现三次的数) 或 3 的倍数 +1(包含出现一次的数)。这个 3 的倍数 +1 的情况也就是我们的目标数的那一位。
题目代码
文章插图
我们来解析一下我们的代码
>>二进制右移运算符。左操作数的值向右移动右操作数指定的位数。
另外我们的代码中还包含了 a & 1和a | 1 这有什么作用呢?继续看下图
&按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0
文章插图
因为我们 a & 1 中 1 只有最后一位为 1,其余位皆为 0 ,所以我们发现 a & 1的作用就是判断 a 的最后一位是否为 1 ,如果 a 的最后一位为 1 ,a & 1 = 1,否则为 0 。所以我们还可以通过这个公式来判断 a 的奇偶性。
|按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。
文章插图
这个公式的作用就是将我们移位后的 res 的最后一位 0 变为 1。这个 1 也就代表着我们只出现一次元素的某一位。
只出现一次的数Ⅲ
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。
示例 :
输入: [1,2,1,3,2,5]输出: [3,5]
这个也很容易理解,算是对第一题的升级,第一题有 1 个出现 1次的数,其余出现两次,这个题目中有 2 个出现 1次的数,其余数字出现两次。那么这个题目我们怎么做呢?我们看一下能不能利用第一题中的做法解决。
HashSet
这个做法和我们第一题的做法一致,只要理解了第一题的做法,这个很容易就能写出来,有一点不同的是,第一题的 HashSet 里面最后保留了一个元素,该题保留两个元素。
题目代码:
文章插图
位运算
第一题中,我们可以通过异或运算直接求出目标数,但是我们第二题中不能直接用异或,是因为其他数字都出现三次,目标数出现一次。在这个题目中其他数字出现两次,目标数出现一次,但是这次的目标数为两个,我们直接异或运算的话,得到的数则为两个目标数的异或值,那么我们应该怎么做呢?
- 量子处理器|微软联手毕马威 借助Azure Quantum提供优化解决方案
- 3d|解决用户审美疲劳问题的办法
- 搜狐|施耐德电气在欧洲电力展推出面向未来电网的全生命周期管理解决方案
- 固态硬盘|电脑键盘洒了半杯水,客户教科书式的解决方式,把我直接看懵了!
- 新浪网|助力海南自贸港建设,易生支付重磅推出国际邮轮收单一体化解决方案
- 硬盘|Dell游戏本G3非常卡,难怪重装几次系统还没解决,问题出在了这!
- MIUI|不怕找不到停车场了!高德地图停车雷达来了:临停、公厕都能解决
- 解决方案|如何写好B2B客户案例?
- 外卖员|美团外卖员往麻辣烫里面撒尿?这是一个密封封条就能解决的问题
- 联想|私有化是联想困局的最佳解决方案?