剑指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次的数字,最后将两组的异或结果返回即可

  1. 遍历数组,对数组中的所有数字执行异或
    根据异或的特性:两个相同数字异或为 0,可得到两个目的数字的异或结果
  2. 因为两个只出现一次的数字不相同,异或结果中肯定含有一个1,求出1的位数 (从右边数第一个1在第几位, 记为 tmp)
  3. 以第 tmp 位上是1还是0为标准,将数组分成两个子数组
  4. 最后分别遍历两个子数组,对其元素进行异或处理
  5. 返回异或结果即可

代码实现:

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-I 数组中数字出现的次数

剑指 Offer 56 - I. 数组中数字出现的次数

乱序版 ● 剑指offer每日算法题打卡题解——位运算 (题号56)

剑指 Offer 56 - I. 数组中数字出现的次数-真是妙蛙种子吃着妙脆角秒进米奇妙妙屋秒到家了

剑指Offer——数字在排序数组中出现的次数

《剑指Offer——数字在排序数组中出现的次数》代码