zoukankan      html  css  js  c++  java
  • 位运算-查找数组中唯一成对的数

    异或运算特点:

    异或..就是不带进位的加法..
    1+1=10,舍掉进位为0
    1+0=1
    0+1=1
    0+0=0

    如果还不是很明白只要记住  异或:二者不同时结果为1

    题目:找出唯一成对的数

      1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?

    解题思路:这里使用的原理是连续的数字异或可以消除重复,A ^ A=0,( A ^ A ) ^ B ^ ( C ^ C ) =B,但是我们的题目有两个元素重复,假如使用一次异或那么这个重复的元素就会被消掉了。所以这里有一个小技巧,就是使用两次异或,先对不包含重复值数组进行异或,在对包含重复值的数组进行异或,这样下来,就相当于除了重复值每个值都异或了两次,而重复的值异或了三次,这样异或下来,就只剩一个重复的值了,就成功找出来了。为了方便测试,这里只使用了11个元素的数组,自行改成1001即可(示例代码也给出了使用辅助存储空间的解法)。这里有一个特殊的点,就是这里给出了数组是1-1000连续的数并且只有唯一一个元素值重复,所以才能构造进行异或两次的解法。

    如下实现代码:

    import java.util.Random;
    
    public class Main {
    
        public static void main(String[] args) {
    
            int N = 1001;
            int [] arr = new int[N];
            for (int i = 0; i < arr.length-1; i++) {
                arr[i] = i+1;
            }
            // 最后一个数,是随机数
            arr[arr.length-1] = new Random().nextInt(N-1)+1;
            // 随机下标
            int index = new Random().nextInt(N);
            swap(arr, index, arr.length-1);
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i]+ "  ");
            }
            System.out.println();
            int x1=0;
            for(int i=1;i <= N -1;i++){
                x1 = (x1^i);   // 求得1到N-1这些连续的数的异或
            }
            for(int i=0;i < N ;i++){
                x1 = (x1^arr[i]);  // 再与原来的数组arr异或,这样重复的数就有三个,不重复的数有两个,异或消除重复后,剩下的就是重复的数了
            }
            System.out.println(x1);
            System.out.println("使用辅助空间实现============");
            int []helper = new int[N];
            for (int i = 0; i < helper.length; i++) {
                helper[arr[i]]++;
            }
            for (int i = 0; i < helper.length; i++) {
                if (helper[i]==2) {
                    System.out.println(i);
                    break;
                }
            }
    
        }
        public static void swap(int[] array,int x,int y){
            int xx = array[x];
            int yy = array[y];
            array[x] = yy;
            array[y] = xx;
        }
    
    }

    运行后的结果:

  • 相关阅读:
    Redis设计与实现第一部分:第5章:Redis 跳跃表
    根据临时表修改主表的某字段数据根据主表的主键
    Redis设计与实现第一部分:第2章:简单动态字符串SDS
    Redis
    MySQL的访问控制与用户管理
    MySQL字符集和语言的基础知识
    生成日志文件
    Python进阶09 动态类型
    Python进阶08 异常处理
    Python进阶07 函数对象
  • 原文地址:https://www.cnblogs.com/daiorz/p/12726030.html
Copyright © 2011-2022 走看看