找单独的数

105 阅读1分钟

你需要在一个整数数组中找到唯一一个出现一次的数字,而其他数字都恰好出现两次。

数据结构选择

由于题目要求时间复杂度为 O(n),并且尽量减少额外空间的使用,我们可以考虑使用位运算来解决这个问题。

算法步骤

  1. 异或运算的特性:异或运算(XOR)有一个非常有用的特性:

    • 任何数与自身异或的结果是 0,即 a ^ a = 0
    • 任何数与 0 异或的结果是它自身,即 a ^ 0 = a
    • 异或运算满足交换律和结合律,即 a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
  2. 利用异或运算:我们可以遍历整个数组,对所有元素进行异或运算。由于其他数字都出现两次,它们会相互抵消,最终剩下的就是那个只出现一次的数字。

总结

通过利用异或运算的特性,我们可以在 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);
}
}