在数组中查找唯一出现一次的数字
- 在数组中查找唯一出现一次的数字
- 算法思路
在数组中查找唯一出现一次的数字
在班级活动中,每位同学都拿到一张写有整数的卡片。其中,除了一个数字外,其余数字都恰好出现两次。现在,班长小 C 需要快速找出那张写有独特数字的卡片。本文将介绍一种时间复杂度为 O (n) 且额外空间使用极少的高效算法来解决此问题。
算法思路
为了在满足时间复杂度要求的同时减少额外空间的使用,我们利用异或运算的特性来设计算法。异或运算(用符号 “^” 表示)具有以下两个重要性质:
任何数与 0 进行异或运算,结果为该数本身,即 a ^ 0 = a。
任何数与自身进行异或运算,结果为 0,即 a ^ a = 0。
基于这两个性质,我们可以遍历数组中的每个元素,将结果变量初始化为 0,然后依次与数组中的元素进行异或运算。由于相同的数字出现两次,它们异或后结果为 0,而唯一出现一次的数字与 0 异或后就是其本身。最终,异或运算的结果就是我们要找的那个独特的数字。
下面是使用 Java 语言实现上述算法的代码:
代码片
.
public class Main {public static int solution(int[] cards) {// 初始化结果变量为0int 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);}
};
在上述代码中,solution 方法接收一个整数数组 cards 作为参数。首先,初始化 result 为 0,然后通过 for-each 循环遍历数组中的每个元素,将 result 与当前元素进行异或运算。最后,返回 result,即为数组中唯一出现一次的数字。
main 方法用于测试 solution 方法的正确性,通过输出两个测试用例的结果来验证算法的有效性。
测试验证
通过运行 main 方法中的测试用例,可以验证算法的正确性。在第一个测试用例中,数组 {1, 1, 2, 2, 3, 3, 4, 5, 5} 中唯一出现一次的数字是 4,算法返回结果与预期相符。在第二个测试用例中,数组 {0, 1, 0, 1, 2} 中唯一出现一次的数字是 2,算法同样返回了正确的结果。
通过这种方式,我们利用异或运算的特性,高效地解决了在数组中查找唯一出现一次数字的问题,同时满足了时间复杂度和空间复杂度的要求。希望本文的内容对你理解和解决类似问题有所帮助。
.js/