刷题之路,道阻且长(一)| 豆包MarsCode AI刷题

53 阅读3分钟

今天先从一道简单的题入手,体验一下豆包的ai刷题跟别的刷题有什么不一样吧

题目:找单独的数

问题描述

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

要求:

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

测试样例

样例1:

输入:cards = [1, 1, 2, 2, 3, 3, 4, 5, 5]
输出:4
解释:拿到数字 4 的同学是唯一一个没有配对的。

样例2:

输入:cards = [0, 1, 0, 1, 2]
输出:2
解释:数字 2 只出现一次,是独特的卡片。

样例3:

输入:cards = [7, 3, 3, 7, 10]
输出:10
解释:10 是班级中唯一一个不重复的数字卡片。

约束条件

  • 1 ≤ cards.length ≤ 1001
  • 0 ≤ cards[i] ≤ 1000
  • 班级人数为奇数
  • 除了一个数字卡片只出现一次外,其余每个数字卡片都恰好出现两次

首先进行题目分析:

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

并且题目有以下要求:

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

解题思路

异或操作(XOR)

-   利用异或操作的特性:相同的数字异或结果为 0,任何数字与 0 异或结果为该数字本身。
-   遍历所有同学的卡片数字,将它们依次进行异或操作。因为除了一个数字外,其他数字都出现两次,所以相同的数字在异或操作后会相互抵消,最终剩下的就是那个独特的数字。

这里如果自己没思路的话,可以使用ai来获得解题思路

image.png

根据思路来解题

def solution(num_list):
    # Edit your code here
    unique_num = 0
    for num in num_list:
        unique_num ^= num
    return unique_num


if __name__ == "__main__":
    # Add your test cases here

    print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4)
    print(solution([0, 1, 0, 1, 2]) == 2)

遇到不会的或者不懂的还可以通过ai一建解释

image.png

总结

这道题主要考查以下知识点:

一、算法设计

  1. 时间复杂度分析

    • 要求设计一个时间复杂度为 O (n) 的算法,其中 n 是班级的人数。这涉及到对算法运行时间随输入规模增长的理解,以及如何通过合理的算法设计来达到特定的时间复杂度要求。
  2. 空间复杂度分析

    • 需要尽量减少额外空间的使用,体现算法优化能力。这考查了对算法运行时所需额外存储空间的评估和优化方法。

二、位运算

  1. 异或操作(XOR)的特性

    • 相同的数字进行异或操作结果为 0(例如,a ^ a = 0)。

    • 任何数字与 0 进行异或操作结果为该数字本身(例如,a ^ 0 = a)。

    • 异或操作满足交换律和结合律,即 a ^ b ^ a = b ^ a ^ a = b ^ (a ^ a) = b。

    • 利用这些特性,可以高效地找出数组中只出现一次的数字,而不需要使用额外的数据结构来存储已经出现过的数字。

通过这道题,能够检验对算法复杂度分析和位运算操作的掌握程度,以及在实际问题中运用这些知识设计高效算法的能力。