public class Main {
public static int solution(int[] cards) {
// 初始化一个变量来存储结果
int result = 0;
// 遍历数组中的每个元素
for (int i = 0; i < cards.length; i++) {
// 对每个元素进行异或运算
result ^= cards[i];
}
// 返回最终结果
return result;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 提示用户输入数组
System.out.println("请输入数组元素,以空格分隔:");
// 读取用户输入的数组
String input = scanner.nextLine();
String[] inputArray = input.split(" ");
// 将输入的字符串数组转换为整数数组
int[] cards = new int[inputArray.length];
for (int i = 0; i < inputArray.length; i++) {
cards[i] = Integer.parseInt(inputArray[i]);
}
// 调用 solution 函数并输出结果
int result = solution(cards);
System.out.println("唯一出现一次的数字是:" + result);
scanner.close();
}
# }
题目分析
给定一个数组,其中大部分数字都是成对出现的,只有一个数字是独自出现的,目标是找出这个唯一出现的数字。
常用解题方法
使用哈希表
利用哈希表来记录数字的出现次数。遍历数组,对于每个数字,将其计数;最后返回计数为 1 的数字。
使用排序
先对数组进行排序,数组中成对出现的数字会被排在一起,单独的数字会与其他数字不同。遍历排序后的数组,检查相邻的元素,如果它们不同,说明它们就是单独的数字。
使用数学公式
利用数组中数字和理想情况下成对出现时数字之和的差异。
使用位运算和基于集合
和异或运算类似,但可以结合集合或其他位运算技术来优化。
使用异或运算
过遍历数组并对所有数字进行异或运算,成对出现的数字会被抵消,最后剩下的就是那个单独出现的数字。
异或运算的性质
1.任何数与 0 异或的结果是它本身。 2.任何数与自身异或的结果是 0。 3.异或运算满足交换律和结合律。
异或运算详解
通过异或运算,我们可以逐个遍历数组的数字,并对它们进行异或操作。由于 同一个数字异或两次结果为 0(即 x ^ x = 0),因此成对出现的数字会相互抵消掉,最终唯一剩下的就是那个只出现一次的数字。
时间复杂度和空间复杂度分析
时间复杂度分析
我们只需要遍历一遍数组,因此时间复杂度是 O(n),其中 n 是数组的大小。
空间复杂度分析
我们只使用了一个额外的变量 a来存储最终的结果,因此空间复杂度是 O(1),即常数空间。
总结
通过使用异或运算,我们可以非常高效地解决这个问题。异或运算的性质帮助我们在 O(n) 时间复杂度和 O(1) 空间复杂度内找出那个只出现一次的数字。这种解法不仅时间复杂度优越,而且空间复杂度非常低,适合处理大规模的数据集。