青训营—找单独的数

205 阅读2分钟

题目描述

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。

要求:

  1. 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
  2. 尽量减少额外空间的使用,以体现你的算法优化能力。

测试样例

样例1

输入:cards = [1, 1, 2, 2, 3, 3, 4, 5, 5]
输出:4

样例2

输入:cards = [0, 1, 0, 1, 2]
输出:2

样例3

输入:cards = [7, 3, 3, 7, 10]
输出:10

思路

使用异或运算来找到唯一不重复的数字。因为异或运算有以下特性:a ^ a = 0, a ^ 0 = a

异或运算满足交换律和结合律,因此所有重复的数字会相互抵消,最终剩下的就是唯一不重复的数字。

Java代码

public class Main {
    public static int solution(int[] inp) {
        // Edit your code here
        int res = 0; // 用于存储异或结果
        for (int num : inp) {
            res ^= num; // 对每个数字进行异或运算
        }

        return res; // 返回最终不重复的数字
    }

    public static void main(String[] args) {
        // Add your test cases here
        
        System.out.println(solution(new int[]{1, 1, 2, 2, 3, 3, 4, 5, 5}) == 4);
        System.out.println(solution(new int[]{0, 1, 0, 1, 2}) == 2);
    }
}

复杂度分析

时间复杂度:O(n),其中 n 是数组的长度,我们只需要遍历一次数组。

空间复杂度:O(1),只使用了一个额外的变量来存储结果。

总结

通过使用异或运算,我们能够高效地找到那个独特的数字,同时保持了较低的空间复杂度。这种方法不仅简单易懂,而且在处理类似的问题时也非常有效。