找单独的数 | 豆包MarsCode AI刷题

99 阅读2分钟

问题描述:

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。

要求:

  1. 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
  2. 尽量减少额外空间的使用,以体现你的算法优化能力。

测试样例

样例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));

}