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

相关推荐
一只乔哇噻18 分钟前
java后端工程师+AI大模型开发进修ing(研一版‖day61)
java·开发语言·学习·算法·语言模型
Cx330❀30 分钟前
Git 基础操作通关指南:版本回退、撤销修改与文件删除深度解析
大数据·运维·服务器·git·算法·搜索引擎·面试
前端小白在前进32 分钟前
力扣刷题:合并两个有序数组
算法·leetcode·职场和发展
john_hjy1 小时前
标量、向量、矩阵、张量
算法·机器学习·矩阵
qq_430855881 小时前
线代第一章行列式第八课:克莱姆法则(Cramer法则)
线性代数·算法·矩阵
小妖6661 小时前
力扣(LeetCode)- 542. 01 矩阵
算法·leetcode·矩阵
小年糕是糕手1 小时前
【C++】内存管理(下)
java·c语言·开发语言·数据结构·c++·算法
CoderYanger1 小时前
第 479 场周赛Q2——3770. 可表示为连续质数和的最大质数
java·数据结构·算法·leetcode·职场和发展
像风一样自由20201 小时前
U-Net 图像分割算法:从零开始的完全指南
算法
云泽8081 小时前
蓝桥杯算法精讲:前缀和与差分算法的应用与实战
算法·职场和发展·蓝桥杯