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

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

作者: 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