美文网首页
如何快速找出数组中只出现一次的两个数

如何快速找出数组中只出现一次的两个数

作者: effectiveJava | 来源:发表于2019-06-18 16:32 被阅读0次

1、对于出现两次的元素,使用“异或”操作后结果肯定为0,那么我们就可以遍历一遍数组,对所有元素使用异或操作,那么得到的结果就是两个出现一次的元素的异或结果。

2、因为这两个元素不相等,所以异或的结果中肯定有一位是1,找到为1的那一位在什么位置。

3、根据那一位的位置将数组分为2组,一组该位都是0,一组都是1,每组分别异或就是最后的结果。

4、再次遍历原数组,将每个元素右移到该位置与1相与,得出最后的结果


public static void main(String[] args) {
     int data[] = {1, 2, 2, 3, 3, 4};
    
     int result = 0;
     for (int i = 0; i < data.length; i++) {
         result = result ^ data[i];
     }
    //记录异或结果为1的位置
     int index = 0;
     for (int j = 0; j <= 32; j++) {
         //将两个不同数异或的结果result右移N位,如果与1相与结果为1,就证明该N位是1
         if ((result >> j & 1) == 1) {
             index = j;
             break;
         }
     }
     //用一个数组保存结果
     int resultA[] = new int[2];
     for (int i = 0; i < data.length; i++) {
         //将原数组右移上面的N位与1相与分成两组,得出结果
         if ((data[i] >> index & 1) == 0) {
             resultA[0] = resultA[0] ^ data[i];
         } else {
             resultA[1] = resultA[1] ^ data[i];
         }
     }
     System.out.println(Arrays.toString(resultA));
 }

相关文章

网友评论

      本文标题:如何快速找出数组中只出现一次的两个数

      本文链接:https://www.haomeiwen.com/subject/ktafqctx.html