当前位置: 首页 > ds >正文

136. 只出现一次的数字

目录

一、问题描述

二、解题思路

三、代码

四、复杂度分析


一、问题描述

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

二、解题思路

异或 XOR 的几个性质:

  1. a ^ a = 0(任何数和自己异或为0)

  2. a ^ 0 = a(任何数和0异或还是它本身)

  3. 异或满足 交换律结合律a ^ b ^ c = a ^ (b ^ c)

所以如果一个数组中:

  • 所有元素都出现 两次,只有一个元素出现 一次

  • 那么我们把数组里所有数字都异或一遍,成对的数会变成 0,最终结果就是那个 只出现一次的数

示例:

 

cpp

复制编辑

nums = [2, 3, 2, 3, 5]

这里:

  • 2 出现了两次

  • 3 出现了两次

  • 只有 5 出现了一次,结果应该返回 5


🚀 为什么用异或?

🔢 异或的核心特点:
操作结果含义
a ^ a0自己跟自己异或等于 0
a ^ 0a任何数与 0 异或还是它自己
异或满足 交换律结合律a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b顺序不重要


✅ 用异或解这道题的逻辑:

假设你从左到右,遍历 nums,把所有数都异或到一个变量 result 中。

由于所有数都出现两次,它们“配对异或”之后变成了 0只有那个“只出现一次”的数还剩下来!


🧮 举个完整例子:

nums = [4, 1, 2, 1, 2]

我们用异或来操作:

步骤当前数字异或结果 (result)
初始-0(初始值)
140 ^ 4 = 4
214 ^ 1 = 5
325 ^ 2 = 7
417 ^ 1 = 6
526 ^ 2 = 4

最后结果是 4,就是我们想找的答案!

三、代码

class Solution {
public:int singleNumber(vector<int>& nums) {int result = 0; // 初始结果设为 0// 遍历数组中的所有元素for (int num : nums) {result ^= num; // 把每个数和 result 做异或}return result; // 最后剩下的就是只出现一次的数}
};

四、复杂度分析

项目复杂度说明
⏱ 时间复杂度O(n)只遍历一次数组
🧠 空间复杂度O(1)只用一个整型变量 result

五、小结

  • 什么异或能解决这个问题?
    因为成对的数字会变成 0,只出现一次的那个数字会被留下。

  • 为什么时间是 O(n)?
    因为你只遍历了一次数组。

  • 为什么空间是 O(1)?
    只用了一个整型变量,不管数组多大。

http://www.xdnf.cn/news/14600.html

相关文章:

  • 算法题(力扣每日一题)—改变一个整数能得到的最大差值
  • Arthas 全面学习指南
  • 动手实践:LangChain流图可视化全解析
  • [从0到1]环境准备--anaconda与pycharm的安装
  • Linux系统firewall-offline-cmd命令在企业网络安全防护中的应用案例分析
  • 图形编辑器基于Paper.js教程29:基于图层的所有矢量图元的填充规则实现
  • 【C++】list容器实现
  • Lighthouse与首屏优化
  • 【看到哪里写到哪里】如何在C中使用多进程设计(1)
  • STM32 开发 - STM32CubeMX 下载芯片支持包、创建 HAL 库工程
  • 牙科医疗设备EMC电磁兼容技术讨论
  • 数列的极限
  • 推荐标注数据标注
  • 【精选】计算机毕业设计基于SpringBoot高校社团管理系统 社团信息维护 活动发布报名 成员审核与公告发布平台源码+论文+PPT+讲解
  • Git(三) Git 分支工作流管理模型探究与实践
  • 电容篇---常见作用
  • Apache Iceberg与Hive集成:分区表篇
  • StarRocks Community Monthly Newsletter (May)
  • JavaScript中Date对象用法详解
  • 深入实践Caffeine+Redis两级缓存架构:从原理到高可用设计
  • 「Linux文件及目录管理」文件及目录操作类命令
  • Grdle版本与Android Gradle Plugin版本, Android Studio对应关系
  • OpenWrt:交叉编译openssl
  • redis缓存的基础知识
  • DBSCAN(Density-Based Spatial Clustering of Applications with Noise)基于密度的聚类方法介绍
  • 移动应用开发实验室web组大一下期末考核题解
  • 【arXiv2024】时间序列|TimesFM-ICF:即插即用!时间序列预测新王者!吊打微调!
  • 如何用ai设计测试
  • WebStorm编辑器侧边栏
  • NodeJS的fs模块的readFile和createReadStream区别以及常见方法