【《漫画算法》笔记】找数组中出现奇数次的元素

2023-12-18 23:48:05

给定数组,只有一个元素出现过奇数次

思路:
考虑到异或运算的性质——两个等值数的异或结果等于0,两个不等值的数异或结果为1,
将给定数组的所有元素异或起来,最终结果就是那个“唯一出现过计数次”的数。

给定数组,只有两个元素出现过奇数次

思路:
在上述的基础上,同样对所有元素做异或运算,那么结果必然不是0。也就是说,异或的结果存在某一位非0,假设第a位。这提醒我们,可以根据这个非零位对给定数组中的元素进行分类——分成两类。第一类,二进制表示第a位上为0的元素;第二类,二进制表示第a位上为1的元素。

import java.util.Arrays;

public class findLostNum {
    public static int[] find2Num(int[] arr){
        int[] res=new int[2];

        int xor=0;
        for (int i = 0; i < arr.length; i++) {
            xor^=arr[i];
        }

        if(xor==0){
            return null;
        }

        int sep=1;
        while ((xor&sep)==0){ // 找到xor的二进制表示 最靠右 的‘1’ 的位置
            sep<<=1;
        }
        
        for (int i = 0; i < arr.length; i++) {
            if((sep&arr[i])==0){
                res[0]^=arr[i];
            }else {
                res[1]^=arr[i];
            }
        }
        return res;
    }

    public static void main(String[] args) {
        int[] array=new int[]{4,1,2,2,5,1,4,3};
        int[] res=find2Num(array);
        System.out.println(Arrays.toString(res));

    }
}

文章来源:https://blog.csdn.net/qq_43448491/article/details/135072865
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。