zoukankan      html  css  js  c++  java
  • 算法很美(蓝桥) | 1.2 唯一成对的数

    1.2 如何找到数组中唯一成对的那个数

    题目

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

    标签

    • 位运算
    • 异或

    思路

    异或运算可以消除重复的数,例如

    A ^ A ^ B ^ C ^ C = B
    

    构造1-1000个数的数组(不重复),将其与题目给的1001个数挨个异或,最后剩下的就是要求的那个数

    代码

    public static void main(String[] args) {
        // ===================构造题目所需数组Start===================
        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);
        Util.swap(arr, index, arr.length - 1);
        Util.print(arr);
        // ===================构造题目所需数组End===================
        int x1 = 0;
        // 构造1-1000的数组
        for (int i = 1; i <= N - 1; i++) {
            x1 = (x1 ^ i);
        }
        // 遍历每个数,与题目给定的数组进行异或运算,求得结果
        for (int i = 0; i < N; i++) {
            x1 = x1 ^ arr[i];
        }
        System.out.println(x1);
    }
    

    总结

    题目的重点就是不适用额外空间,如果可以使用,其实也可以准备一个1000长度的数组A,存储给定的数组每个数出现的次数,然后再遍历数组A即可获得结果。

    异或解法不仅空间复杂度较低,而且效率更高

  • 相关阅读:
    C#防止窗口重复打开
    c#image与byte数组的转换
    物理网卡地址
    C#[WinForm]实现自动更新
    js计算散点图方程式
    js遮罩效果
    js实现四舍六入 奇进偶舍
    ajax加载表格数据
    C#创建和调用WebService详细教程
    .NET中的CTS、CLS和CLR
  • 原文地址:https://www.cnblogs.com/gcdd1993/p/14675154.html
Copyright © 2011-2022 走看看