你需要在一个整数数组中找到唯一一个出现一次的数字,而其他数字都恰好出现两次。
数据结构选择
由于题目要求时间复杂度为 O(n),并且尽量减少额外空间的使用,我们可以考虑使用位运算来解决这个问题。
算法步骤
-
异或运算的特性:异或运算(XOR)有一个非常有用的特性:
- 任何数与自身异或的结果是 0,即
a ^ a = 0。 - 任何数与 0 异或的结果是它自身,即
a ^ 0 = a。 - 异或运算满足交换律和结合律,即
a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b。
- 任何数与自身异或的结果是 0,即
-
利用异或运算:我们可以遍历整个数组,对所有元素进行异或运算。由于其他数字都出现两次,它们会相互抵消,最终剩下的就是那个只出现一次的数字。
总结
通过利用异或运算的特性,我们可以在 O(n) 的时间复杂度内,并且不使用额外空间的情况下,找到那个唯一的数字。
``public class Main { public static int solution(int[] inp) { int result = 0; for (int num : inp) { result ^= num; } 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);
System.out.println(solution(new int[]{7, 3, 3, 7, 10}) == 10);
}
}