算法:数组找出2个只出现一次的数字(其他元素出现两次)

来源:互联网 发布:js点击弹出对话框 编辑:程序博客网 时间:2024/05/21 10:09

思路:
1、依然从头到尾异或所有的数字,这样得到的结果实际上就是两个只出现了一次的数字异或的结果,
2、在异或后的结果中找出其二进制中最右边为1的位,该位既然为1,说明异或的两个数字对应的该位肯定不同,必定一个为1,一个为0
3、根据此位是否为1来划分这两个部分,返回为true的元素异或得到一个数字为num1,返回false的所有元素异或的到num2

/** * Created by Administrator on 2016/7/4. * 数组2个只出现一次的数字,其他都是出现2次 * 分析: * 假设这个2个数为a,b,一个数异或它自己得0 a^a=0 故 把所有的元素异或异常得到的结果是a^b */public class FindUniqueValueDemo {    private static int sum;    private static int num1;    private static int num2;    public static void main(String args[]) {        int[] arr = {3, 5, 6, 3, 2, 5, 7, 7, 11, 9, 6, 8, 9, 8};        findUnique(arr);        System.out.println(sum);        System.out.println(num1 + ":" + num2);    }    private static void findUnique(int[] arr) {        final int end = arr.length;        if (end < 2) {            return;        }        for (int i = 0; i < end; i++) {            sum = sum ^ arr[i];        }        int flag = lastValue1(sum);        for (int j = 0; j < end; j++) {            if (IsBit1(arr[j], flag))                num1 ^= arr[j];            else                num2 ^= arr[j];        }    }    private static int lastValue1(int num) {        //得到该num的最好一个1        return num & ~(num - 1);    }    /**     * 判断data中特定的位是否为1,     * .这里的要判断的特定的位由res确定,     * .flag中只有一位为1,其他位均为0,由lastValue1函数返回,     * .而data中要判断的位便是flag中这唯一的1所在的位     *     * @param data     * @param flag     * @return     */    static boolean IsBit1(int data, int flag) {        return ((data & flag) == 0) ? false : true;    }}
0 0
原创粉丝点击