刷题笔记| 青训营X豆包MarsCode 技术训练营

108 阅读3分钟

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

  1. 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。

  2. 尽量减少额外空间的使用,以体现你的算法优化能力。

  3. 测试样例:略 在写这个题目时,并没有真正的了解到异或运算的特性-对于任何整数 aa ^ a = 0。 -对于任何整数 aa ^ 0 = a。 利用这个性质,可以通过遍历数组并对每个元素进行异或运算来找到唯一的独特数字。因为所有重复的数字都会相互抵消,最终剩下的就是那个唯一的数字。因此就有如下解题思路: 首先 理解问题:题目要求找到数组中唯一一个不重复的数字。 其次,选择数据结构:由于题目要求时间复杂度为 O(n) 且尽量减少额外空间的使用,异或运算是一个理想的选择。 最后,算法步骤

    • 初始化一个变量 result 为 0。
    • 遍历数组中的每一个元素,对每个元素进行异或运算。
    • 最终 result 就是那个唯一的独特数 由此,能够写出完整的解题代码: def solution(inp):

    初始化结果为0

    result = 0

    遍历数组中的每一个元素

    for num in inp: # 对每一个元素进行异或运算 result ^= num

    返回最终结果

    return result

if name == "main": # 添加你的测试用例 print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4) print(solution([0, 1, 0, 1, 2]) == 2) 这段代码定义了一个函数solution,用于在给定的整数列表中找到唯一一个出现次数为一次的数字,其余数字均出现两次。它通过遍历输入列表,对每个元素进行异或运算,利用异或运算的性质(两个相同的数异或结果为 0,任何数与 0 异或结果为它本身)来找到那个单独的数字。 定义了函数solution,其中初始化一个变量result为 0,然后遍历输入列表inp中的每个数字num,对其进行异或运算并更新result。最后返回result作为结果。 2. 在if __name__ == "__main__":条件下,添加了两个测试用例,分别传入不同的列表并验证函数的输出是否符合预期。 优点:- 高效性:时间复杂度为O(n)O(n),只需要对输入列表进行一次遍历,对于大规模输入数据处理速度较快。 - 低空间复杂度:只使用了一个额外的变量result,空间复杂度低,对于资源受限的环境友好。 - 简洁性:代码简洁明了,易于理解和维护。 缺点: - 功能局限性:仅适用于特定问题,即一个数字出现一次,其他数字都出现两次的情况。如果问题条件变化,如多个数字出现一次或数字出现次数不同,该算法需要进行较大修改。 - 缺乏灵活性:没有参数校验等功能,对于输入数据的合法性没有进行检查,如果输入不是合法的整数列表可能会导致错误结果或异常。