剑指offer 56-I 数组中数字出现的次数
Posted 一朵花花
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer 56-I 数组中数字出现的次数相关的知识,希望对你有一定的参考价值。
题目
题目链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/.
思路分析:
思考:
若这个数组里只有一个数字只出现了1次,其余数字都出现2次,那么直接遍历数组,执行异或,便可得到这个只出现1次的数字
.
但本题是有两个数字,那么数组里所有数字异或得到的结果,便是那两个数字的异或结果
那我们就可以将数组分成两组,把那两个数组分别放在不同的子数组里,再分别遍历子数组异或即可得到,每组中的那个只出现1次的数字,最后将两组的异或结果返回即可
- 遍历数组,对数组中的所有数字执行异或
根据异或的特性:两个相同数字异或为 0,可得到两个目的数字的异或结果 - 因为两个只出现一次的数字不相同,异或结果中肯定含有一个1,求出1的位数 (从右边数第一个1在第几位, 记为 tmp)
- 以第 tmp 位上是1还是0为标准,将数组分成两个子数组
- 最后分别遍历两个子数组,对其元素进行异或处理
- 返回异或结果即可
代码实现:
public static int[] appearNumber(int[] array){
int ret = 0;
//1.遍历数组,对数组中的所有数字执行异或
for (int x:array) {
ret ^= x;
}
//2.循环找出tmp
int tmp = 1;
while((ret & tmp) ==0){
tmp <<= 1;
}
//3.以第 tmp 位上是1还是0为标准,将数组分成两个子数组
// 以a和b记录其异或结果
int a = 0;
int b = 0;
for (int x:array) {
if((x & tmp)==0) {
a ^= x;
}
else {
b ^= x;
}
}
//返回异或结果
return new int[] {a, b};
}
代码测试:
public static void main(String[] args) {
int[] array = {1,2,4,3,1,4};
System.out.println(Arrays.toString(appearNumber(array)));
}
输出结果:
执行过程:
以上是关于剑指offer 56-I 数组中数字出现的次数的主要内容,如果未能解决你的问题,请参考以下文章
乱序版 ● 剑指offer每日算法题打卡题解——位运算 (题号56)