题目解析 1.找单独的数 | 豆包MarsCode AI刷题

  • 连marscode第一题都不会做的你打开了题目解析
  • 有人相爱,有人夜里开车看海,有人marscode第一题都做不出来。
  • abandon

问题分析

这道题目要求我们从一个数组中找到唯一不重复的数字卡片,其他数字均出现两次。这类问题在算法设计中被归类为 "找单一元素" 的问题,尤其强调了时间复杂度和空间复杂度的优化:

  • 时间复杂度要求:O(n)。
  • 空间复杂度要求:尽可能减少额外的空间开销。

解题思路

首先想到的就是哈希表,只要遍历两次就可以了。

哈希表

利用哈希表统计每个数字出现的次数:

  • 遍历数组时,将数字作为键,出现次数作为值记录在哈希表中;
  • 遍历完成后,检查哈希表,找到值为1的键,即为所求。

这种方法的时间复杂度为 O(n),因为只需要遍历数组一次,同时哈希表的插入和查询操作平均时间复杂度为 O(1)。

但空间复杂度为 O(n),因为需要额外存储所有的键值对,不符合题目中"尽量减少额外空间"的要求。

不过其实还有一个更高效的方法------异或

位运算:异或操作

一种巧妙且高效的方法是利用 异或运算 (XOR) 的性质:

  • a⊕a=0:相同的数字异或后为0;
  • a⊕0=a:任意数字与0异或仍为它本身;
  • 异或运算满足交换律和结合律:a⊕b⊕a=(a⊕a)⊕b=0⊕b=b。

基于上述性质,题目中数组中的所有成对数字会两两抵消,只剩下唯一的单一数字。因此,通过对数组中的每个数字依次进行异或操作,最终结果就是我们要找的独特数字。

算法步骤

  1. 初始化一个变量 unique_number = 0
  2. 遍历数组 cards,将每个数字依次异或到 unique_number 上;
  3. 遍历结束后,unique_number 就是结果。

代码实现

arduino 复制代码
def solution(cards):
    unique_number = 0
    for card in cards:
        unique_number ^= card
    return unique_number

时间复杂度:O(n) ------ 只需遍历一次数组。

空间复杂度:O(1) ------ 只使用了一个额外变量 unique_number

总结

方法 时间复杂度 空间复杂度 备注
哈希表 O(n) O(n) 高效,但空间开销较大
异或操作 O(n) O(1) 高效,最优解法

利用异或运算的性质,这道题可以在时间复杂度 O(n) 和空间复杂度 O(1) 下解决,展现了算法设计中巧用数学性质的魅力。

相关推荐
BothSavage4 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn4 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽5 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
先吃饱再说21 小时前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰1 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术1 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六1 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术1 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize1 天前
初识DFS 与 BFS:递归、队列与图遍历
算法