剑指offer——数组中只出现一次的数字
来源:互联网 发布:有搭接的网络参数计算 编辑:程序博客网 时间:2024/05/22 13:58
题目描述:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:
先考虑只有只有一个数字出现一次的情况,因为其他数字只出现了两次,所以对这两个数字进行异或运算的时候,其结果是0,那么那个只出现一次的数字进行异或运算的时候,其结果必然不是0,所以可以利用这点找出那个只出现一次的数字。现在考虑有两个数字出现一次的情况,仍然借鉴上面的思路,因为只出现一次的那个数字的异或结果不是0,遍历整个数组进行异或运算的结果也肯定不是0,现在可以对该数右边第一个是1的位的位置作为标准(记为n),将整个数组进行拆分,这样会得到两组数组,一组n位的位置的值都是1,另一组则都是0。用一个简单的例子就可以说明这点:一个数组{1,2,2,3,3,4},遍历进行异或运算的结果是0110,右边第一个不是0的位的位置的2,那么数组{1}和{2,2,3,3,4}。第一个数组的右数第2位的值都是0,而第二个数组右数第2位的值都是0。所以在对第一组进行异或运算的结果是1,第二个数组进行异或运算的结果是4,因为其他都出现了两次,异或运算之后变成了0。
算法实现:
//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果public class Solution { public void FindNumsAppearOnce(int[] array, int num1[], int num2[]) { if(array == null || array.length < 2) return; int resultExclusiveOr = 0; for (int i = 0; i < array.length; i++) { resultExclusiveOr ^= array[i]; } //找到右边第一个是1的位的位置 int rightFirstIndexIs1 = findFirstIndexis1(resultExclusiveOr); //把该位是1的与不是1的数分别两部分 for (int i = 0; i < array.length; i++) { if(isBit1(array[i],rightFirstIndexIs1)){ num1[0] ^= array[i]; }else{ num2[0] ^= array[i]; } } } //数num右数index为是否为1 private boolean isBit1(int num, int index) { num = num >> index; return ((num & 1) == 1) ? true : false; } //找到右边第一个是1位的位置 private int findFirstIndexis1(int resultExclusiveOr) { int index = 0; while(((resultExclusiveOr & 1) == 0) && index < 32){ resultExclusiveOr = resultExclusiveOr >> 1; index++; } return index; }}
1 0
- 剑指offer—数组中只出现一次的数字
- 剑指offer—数组中只出现一次的数字
- 剑指offer — 数组中只出现一次的数字
- 剑指offer--数组中只出现一次的数字
- 剑指Offer之 - 数组中只出现一次的数字
- [剑指Offer]40.数组中只出现一次的数字
- 剑指offer-40 数组中只出现一次的数字
- 剑指offer 数组中只出现一次的数字
- 剑指offer 40-数组中只出现一次的数字
- 《剑指offer》数组中只出现一次的数字
- 【剑指offer】之数组中只出现一次的数字
- [剑指offer-1351]数组中只出现一次的数字
- 剑指offer:数组中只出现一次的数字
- 剑指offer 40 数组中只出现一次的数字
- 剑指offer:数组中只出现一次的数字
- 剑指offer 数组中只出现一次的数字
- [剑指offer]数组中只出现一次的数字
- 剑指Offer--040-数组中只出现一次的数字
- 增强的页面元素
- 转载---小甲鱼PE详解之区块表(节表)和区块(节)续(PE详解05)
- HDU 57242016多校Contest 1 B题【SG函数,题目input比较猥琐】
- lintcode coins-in-a-line 硬币排成线
- Leetcode 48. Rotate Image (Medium) (cpp)
- 剑指offer——数组中只出现一次的数字
- C语言程序设计谭浩强版 一
- uc高级编程之创建和删除目录
- Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null obj
- Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)
- 论文笔记 | FaceNet: A Unified Embedding for Face Recognition and Clustering
- 转载--小甲鱼PE详解之区块描述、对齐值以及RVA详解(PE详解06)
- 逆向技能+2 JNI介绍
- OpenJudge 百练 2016 ACM 暑期课练习题 滑雪