题目解析 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) 下解决,展现了算法设计中巧用数学性质的魅力。

相关推荐
被制作时长两年半的个人练习生1 分钟前
近期的笔试和面试的复盘
算法·面试·职场和发展·算子
gsfl1 小时前
贪心算法1
算法·贪心算法
小猪咪piggy1 小时前
【算法】day8 二分查找+前缀和
算法
Word码1 小时前
[排序算法]希尔排序
c语言·数据结构·算法·排序算法
前端小刘哥1 小时前
解析视频直播点播平台EasyDSS在视频点播领域的技术架构与性能优势
算法
QT 小鲜肉2 小时前
【数据结构与算法基础】05. 栈详解(C++ 实战)
开发语言·数据结构·c++·笔记·学习·算法·学习方法
lingran__2 小时前
算法沉淀第七天(AtCoder Beginner Contest 428 和 小训练赛)
c++·算法
前端小刘哥2 小时前
新版视频直播点播平台EasyDSS,打通远程教研与教师培训新通路
算法
2401_840105202 小时前
P1049 装箱问题 题解(四种方法)附DP和DFS的对比
c++·算法·深度优先·动态规划
kobe_t2 小时前
数据安全系列7:常用的非对称算法浅析
算法