AI刷题分享| 豆包MarsCode AI刷题

122 阅读3分钟

大家好,今天我来继续分享我的豆包MarsCode AI刷题。这次我将解决两个问题,首先是小R的糖果选择,其次是找单独的数,这两个问题都比较简单。

第一题-小R的糖果选择

问题描述

小R来到糖果店,想要购买一根长长的糖果。糖果店允许顾客选择从中间的某个位置切断,切断后的前半段会被出售。每段糖果有着不同的口味,小R希望她购买的糖果段中包含尽可能多不同的口味。你能帮助小R计算她能购买的最长不重复口味的糖果段吗?

糖果的每段长度为1,小R只对连续的一段感兴趣,并且希望这段糖果的口味不重复。

示例

当输入的数组arr =[5, 1, 2, 2, 3, 4, 5]时,由于第四个数字和第三个数字相同,所以应在第三个数字后切断,应返回3.

解题步骤

这个问题思路比较简单,题目是要计算最长的不重复口味的糖果段的长度。先遍历数组,如果当前遍历的数组的元素和之前的数组元素有相同,则停止遍历,返回长度即可。

实现代码

csharp
 代码解读
复制代码
public static int solution(int n, int[] a) {
        // write code here
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < a.length; i++) {
            if(set.add(a[i])==false){
                return i;
            }
            set.add(a[i]);
        }
        return n;
}

细节注意

由于题目是要求最长的不重复序列,因此如何判断不重复非常关键,我想到的思路找到一个集合存储遍历过的元素,将要遍历的元素和这个集合进行对比,如果有重复,则直接返回长度。因此我就想到了set集合,set集合是比较典型的不重复的单列链表,因此可以将遍历的元素添加到set中,如果添加成功则代表不重复,添加失败则直接返回长度,感觉这种方式比较简单。

第二题-找单独的数

问题描述

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

要求:

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

示例

当输入的数组cards =[0, 1, 0, 1, 2]时,由于2只出现了1次,所以输出2即可。

解题步骤

这个问题思路比较简单,遍历数组,找到那个只出现1次的数字即可。

实现代码

arduino
 代码解读
复制代码
public static int solution(int[] cards) {
        // Edit your code here
        int single = 0;
        for (int num : cards) {
            single ^= num;
        }
        return single;

}

细节注意

刚开始做的时候感觉比较简单,想到了定义临时变量判断的方式,后来就感觉非常不可行。后来又想到了用哈希表map添加键值对的方式,将元素的值作为键,元素出现的次数作对值,添加完成以后,再遍历值,找到那个次数为1的元素,这种方式感觉是可以的,但是比较麻烦,需要额外遍历一次,并且空间复杂度也比较高。其实还有一种方法,就是用位运算。因为整个数组只有一个数字出现一次,而剩余的数字都出现了两次,出现两次的数字进行位运算时,必然会得到0,因此我们只需从头到尾进行位运算,得到的数字必定是出1次的数字,这种方法既不需要额外的空间,又很简单,是一个非常巧妙的方法。