概述
题目描述
一个整数数组里除了两个数字出现一次,其他数字都出现两次。请找出这两个数字。要求时间复杂度为o(n),空间复杂度为o(1)。
这种设计到位运算的我就觉得比递归友好多了,数据处理角度不一样,感觉很有意思。
解题思路
- 设法划分为两个数组,将只出现一次的数字分别存入两个数组
- 分别对两个数组异或运算
算法图解
参考代码:
package offer;
/**
* 数组中数字出现的次数
* 数组中只出现一次的两个数字
* 统计一个数字在数组中出现的次数。例如输入排序数组{2,4,3,6,3,2,5,5} 4 6
*/
public class Offer56 {
public static void main(String[] args) {
int nums[] = {2, 4, 3, 6, 3, 2, 5, 5};
findAppearOnce(nums);
}
/**
* 设法将只出现一次的数据分别放入两个数组 再对两个数组做异或运算
*
* @param nums
*/
static void findAppearOnce(int nums[]) {
if (nums == null || nums.length < 2) {
return;
}
int result = 0;
for (int i = 0; i < nums.length; i++) {
result ^= nums[i];
}
int findFirstOne = 0;
// 找到最后一个为1的位置
while ((result & 1) == 0 && findFirstOne < 32) {
result = result >> 1;
findFirstOne++;
}
// 分两部分数组分别做循环与运算 最后剩下的就是单独的
int tag1 = 0, tag2 = 0;
for (int i = 0; i < nums.length; i++) {
if ((nums[i] >> findFirstOne & 1) == 0) {
tag1 ^= nums[i];
} else {
tag2 ^= nums[i];
}
}
System.out.println(tag1+"---"+tag2);
}
}
附录
该题源码在我的 ?Github 上面!
最后
以上就是会撒娇未来为你收集整理的[剑指Offer]-数组中数字出现次数的全部内容,希望文章能够帮你解决[剑指Offer]-数组中数字出现次数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复