题目描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
要求:
- 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
测试样例
样例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),只使用了一个额外的变量来存储结果。
总结
通过使用异或运算,我们能够高效地找到那个独特的数字,同时保持了较低的空间复杂度。这种方法不仅简单易懂,而且在处理类似的问题时也非常有效。