问题描述 在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。 要求: 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。 尽量减少额外空间的使用,以体现你的算法优化能力。 测试样例 样例1: 输入:cards = [1, 1, 2, 2, 3, 3, 4, 5, 5] 输出:4 解释:拿到数字 4 的同学是唯一一个没有配对的。 样例2: 输入:cards = [0, 1, 0, 1, 2] 输出:2 解释:数字 2 只出现一次,是独特的卡片。 样例3: 输入:cards = [7, 3, 3, 7, 10] 输出:10 解释:10 是班级中唯一一个不重复的数字卡片。 约束条件 1 ≤ cards.length ≤ 1001 0 ≤ cards[i] ≤ 1000 班级人数为奇数 除了一个数字卡片只出现一次外,其余每个数字卡片都恰好出现两次 让我们来逐步解决这个问题。根据题目要求,我们需要找到数组中唯一一个出现一次的数字,并且要求时间复杂度为 O(n),空间复杂度尽量低。 解题思路 理解问题:数组中除了一个数字外,其他数字都出现了两次。我们需要找到这个唯一的数字。 数据结构选择:由于题目要求时间复杂度为 O(n),并且尽量减少额外空间的使用,我们可以考虑使用位运算来解决这个问题。 算法步骤: 使用异或运算(XOR)来处理数组中的每个元素。 异或运算的特性是:a ^ a = 0 和 a ^ 0 = a。因此,所有出现两次的数字在异或运算后会相互抵消,最终剩下的就是唯一出现一次的数字。 代码提示 在你的代码中,我们可以利用异或运算来实现这个算法。以下是代码提示: java public class Main { public static int solution(int[] cards) { // 初始化一个变量来存储 结果 int result = 0; // 遍历数组中的每个元素 for (int card : cards) { // 对每个元素进行 异或运算 result ^= card; } // 返回最终结果 return result; } public static void main (String[] args) { // 添加你的测试用例 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); }} 关键步骤解释 初始化结果变量:int result = 0; 初始值为0,因为任何数与0异或结果还是它本身。 遍历数组:for (int card : cards) 对数组中的每个元素进行异或运算。 异或运算:result ^= card; 所有出现两次的数字会相互抵消,最终剩下的就是唯一出现一次的数字。 通过这种方式,我们可以在 O(n) 的时间复杂度内解决问题,并且只使用了常数级别的额外空间。