问题描述:
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
要求:
- 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
测试样例
样例1:
输入:
cards = [1, 1, 2, 2, 3, 3, 4, 5, 5]
输出:4
解释:拿到数字 4 的同学是唯一一个没有配对的。
编码思路
个人角度而言,该问题的重点有二:
其一是对整体数据进行遍历。
其二是查看其中数据是否有相同部分,并将其不同的数据取出。
所以,我们就可以开始代码编写,关于第一点,我们可以使用foreach方法进行循环遍历,其语法更简洁,可以通过迭代器或直接访问集合元素。
使用方法如下:
其中,int card是我们每次遍历出的数据,cards则是我们需要进行遍历的数组
foreach(int card:cards)
关于第二点,我们则可以使用java中的异或运算符,即可以对两个数进行异或运算,若两个数相同,则取0,若两个数不同,则取1,因此,也可以运用在简单的算法中,快速找到整个数组中的单独数。
举个小例子:
int list[] = {1,1,2,2,3,4,4,3,5};
int a = 0;
//在这里使用的是fori循坏
for (int i = 0; i < list.length; i++) {
a ^= list[i];
}
System.out.println("单独数为" + a);
在了解这两个重要点的解决方式后,我们就可以快速的将代码编写出来。
具体代码
public static int solution(int[] cards) {
int a=0;
for(int card:cards){
a ^= card;
} return a;
}
public static void main(String[] args){
int[] cards1 = {1, 1, 2, 2, 3, 3, 4, 5, 5};
System.out.println(solution(cards1));
}