数组中只出现一次的数字_JAVA_中等
数组中只出现一次的数字
http://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811
- 将数组全部异或,相同的将抵消,得出两个不同的值的异或
- 该值(二进制)为1的位则是两值不同的位,根据该位分组,两个值将会被分到不同的组,而相同的值会被分到一组(可被抵消),不同组内重新进行异或,则两个值会被分离
- 如何得出该值:ret ^= (-ret),因为ret和-ret加起来等于0的缘故,所以只有最后一位1会相同,最后一位1左侧是每一位都不同,最后一位1右侧是全为0
- 如何分组:与该值进行与操作
//num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果 public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { int ret = 0; // 计算两个不同数的异或值 for(int e : array) { ret ^= e; } // 计算两个不同数不同的位数 ret &= -ret; // 分组 for(int e : array) { if((e & ret) == 0) { num1[0] ^= e; } else { num2[0] ^= e; } } } }