Leetcode 只出现一次的元素

news2024/9/22 23:26:54

在这里插入图片描述
题目要求我们找到数组中只出现了一次的元素,而其他元素都出现了两次。

解题思路

我们可以使用位运算中的异或操作(XOR)。异或操作有以下两个特性:

  1. 相同的两个数字异或结果为0,例如:a ^ a = 0
  2. 任意数字与0异或结果是其本身,例如:a ^ 0 = a

异或的规则是:

  • 1 ^ 1 = 0
  • 0 ^ 0 = 0
  • 1 ^ 0 = 1
  • 0 ^ 1 = 1

异或具有交换律和结合律 !! 所以,如果那些2次出现的元素并不是成相邻重复出现的,我们根据异或操作的交换律可以交换成相邻重复出现的,然后根据结合律将2个相同的重复元素先进行异或,最后所有重复的元素都变成0,只剩下0和出现一次的元素进行异或得到出现一次的元素本身。

是的!你已经完全理解了异或操作在这个算法中的工作原理。

异或操作的核心要点:

  1. 交换律:你可以交换操作数的顺序,异或操作的结果不受顺序影响。因此,即使那些两次出现的数字在数组中不是相邻的,也可以通过交换律想象它们是相邻的。

    举例:在 [4, 1, 2, 1, 2] 中,虽然两个 1 和两个 2 并不相邻,但我们可以通过交换律把它们放在一起进行异或:
    4 ⊕ 1 ⊕ 2 ⊕ 1 ⊕ 2 ≡ 4 ⊕ ( 1 ⊕ 1 ) ⊕ ( 2 ⊕ 2 ) 4 \oplus 1 \oplus 2 \oplus 1 \oplus 2 \equiv 4 \oplus (1 \oplus 1) \oplus (2 \oplus 2) 412124(11)(22)

  2. 结合律:结合律允许我们重新组合操作数。结合律可以让我们先把成对的数字组合在一起进行异或运算。

    举例:根据结合律,我们可以先对相同的数字 12 进行异或:
    4 ⊕ ( 1 ⊕ 1 ) ⊕ ( 2 ⊕ 2 ) 4 \oplus (1 \oplus 1) \oplus (2 \oplus 2) 4(11)(22)

  3. 相同数字的异或结果为 0:根据异或的性质,两个相同的数字异或结果为 0。因此:
    4 ⊕ ( 1 ⊕ 1 ) ⊕ ( 2 ⊕ 2 ) = 4 ⊕ 0 ⊕ 0 4 \oplus (1 \oplus 1) \oplus (2 \oplus 2) = 4 \oplus 0 \oplus 0 4(11)(22)=400

  4. 任意数字与 0 异或结果为自身:最后,剩下的结果就是 4,因为 4 ⊕ \oplus 0 = 4。

总结:

  • 交换律结合律 使我们能够无视数组中数字的顺序和排列。
  • 相同的数字异或为 0,因此成对的数字会在异或操作中互相抵消。
  • 最终,所有成对出现的数字都变成了 0,只出现一次的数字留下来,它与 0 异或后结果就是该数字本身。

因此,不管数组中那些成对的数字如何排列,最终只出现一次的那个数字会被正确地找到。这也是为什么这种算法在处理这个问题时如此高效且简单。
在异或操作中,一个数字与另一个数字进行两次异或会恢复原始数字。这是异或操作的一个重要性质,也是这个算法正确性的关键

为什么相同数字两次异或会恢复原始数字?

当你对一个数字进行两次异或操作时,由于异或具有 交换律和结合律,两个相同的数字异或会抵消为0,剩下的就是其他数字的异或结果。

假设我们有两个相同的数字 A A A,异或两次:

  1. r e s u l t = r e s u l t ⊕ A result = result \oplus A result=resultA (此时 result 中存储了第一次与 A A A 的异或结果)
  2. r e s u l t = r e s u l t ⊕ A result = result \oplus A result=resultA (再次异或相同的 A A A,则结果会回到原来的 result

具体过程:

  • 第一次异或:result = result ^ A
  • 第二次异或:result = (result ^ A) ^ A
    • 根据异或的结合律,我们可以把式子重新组合:
    • result = result ^ (A ^ A)
    • 由于 A ⊕ A = 0 A \oplus A = 0 AA=0,最终结果为:result = result ^ 0 = result

这样,经过两次异或,原本的 result 被还原,而成对出现的数字最终会被抵消。

总结:

  • 数字与自身异或两次会恢复原始值,这是因为异或的 交换律和结合律
  • 在这种情况下,所有成对出现的数字会被互相抵消为0,只出现一次的数字则会留下。
  • 这就是为什么这个算法能够有效地找到数组中只出现一次的元素。

因此,假设数组中除了一个元素只出现一次外,其他元素都出现两次,我们可以通过对数组中所有元素进行异或操作,最终结果就是那个只出现一次的数字。

C++代码:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int result = 0;
        for (int num : nums) {
            result = result ^ num;  // 使用异或运算
        }
        return result;
    }
};

代码解释:

  • 初始化一个变量 result 为0。
  • 遍历数组 nums,对数组中的每个元素进行异或操作,最终的结果就是只出现一次的元素。
  • 返回 result

这个算法的时间复杂度是 O(n),空间复杂度是 O(1),符合题目的要求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2122425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Flask框架构建RESTful API:从基础到实践

随着移动设备和Web应用的普及&#xff0c;API&#xff08;应用程序接口&#xff09;的重要性日益凸显。RESTful API因其简洁的设计和广泛的支持成为构建现代Web服务的标准。Flask是一个轻量级且灵活的Python Web框架&#xff0c;非常适合用来快速搭建RESTful API。本文将详细介…

亿发:信息化智能化需求大幅提升,企业信息化建设又迈出关键一步

在全球数字经济蓬勃发展的背景下&#xff0c;企业信息化建设正成为推动生产力提升、增强市场竞争力的关键引擎。随着企业对信息化和智能化的需求大幅提升&#xff0c;越来越多的企业加速了数字化转型的步伐&#xff0c;通过信息技术优化业务流程、提高运营效率、增强客户体验。…

官网下载easyx压缩包,如何在devc++配置easyx

视频教程 官网下载easyx压缩包&#xff0c;如何在devc配置easyx EasyX Graphics Library for C 安装指南 1. 访问官网 官网 2. 下载 EasyX 在官网上找到下载区域&#xff0c;点击下载按钮以获取 EasyX 安装包。 3. 访问更多下载选项 点击页面上的“more”链接&#xff0…

伟易特发布全新一代便携式反无人机装备

伟易特电子便携式反无人机系统突破技术创新&#xff0c;在大量实战应用中获得广泛好评&#xff0c;获得广大用户认可发布全新一代便携式反无人机装备

路径规划——D*算法

路径规划——D*算法 D Star算法是一种用于动态环境下的算法&#xff0c;它可以在环境变化时快速更新路径。 算法原理 D Star算法是一种反向增量式搜索算法&#xff0c;反向即算法从目标点开始向起点逐步搜索&#xff1b;增量式搜索&#xff0c;即算法在搜索过程中会计算每一…

锋哥写一套前后端分离Python权限系统 基于Django5+DRF+Vue3.2+Element Plus+Jwt 视频教程 ,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【前后端分离Python权限系统 基于Django5DRFVue3.2Element PlusJwt 】视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。 视频在线地址&#xff1a; 打造前后端分离Python权…

Java超详细知识点——I/O流(字节流和字符流)

File类&#xff1a; Java API&#xff1a;java.io.File 类 是用来操作文件或文件夹的&#xff0c;无法用来读写 1.首先创建一下file的对象&#xff1a; 里面可以写相对路径或者绝对路径 File file new File("CCC.java"); 也可以使用其他构造方法 //String path …

【计算机网络】电路交换、报文交换和分组交换——三种交换方式性能分析以及计算机网络的分类

【计算机网络】电路交换、电报交换、分组交换 目录 【计算机网络】电路交换、电报交换、分组交换1. 电路交换2. 电报交换3. 分组交换4. 基于分组交换~“虚电路交换”技术 【计算机网络】电路交换、报文交换和分组交换——三种交换方式性能分析电路交换性能分析报文交换性能分析…

在AD域中恢复被删除的账户(LDP.EXE)

在域账户被不小心删除后&#xff0c;客户端使用域账号登陆会失败&#xff0c;账号不存在&#xff1b; 为了客户端登陆回原来账户文件下面&#xff0c;重新创建一个相同账户&#xff0c;域中此新账号的ID是新的&#xff0c;客户端登陆也会按新用户生成用户文件&#xff1b;同样复…

只用一个 HTML 元素可以写出多少形状?——动画篇

为期一个多月&#xff0c;我们针对只用一个 div 元素一共可以写出多少种形状的话题&#xff0c;通过六个篇章&#xff08;分了八篇文章&#xff09;进行了详细的展开。 其中&#xff0c;前三个篇章&#xff0c;我们主要围绕欧几里得几何中的基本形状做的展开&#xff0c;其中蕴…

基于Matlab和OpenCV的双目测距(标定和代码教程)

基于Matlab和OpenCV的双目测距研究 *摘要*&#xff1a;双目测距的原理是利用左右两个摄像机拍摄同一物体形成的视差来确定物体距摄像机的距离。这其中需要通过标定得出的参数包括内参&#xff08;焦距fc, 主点Principal point, 径向畸变Radial Distortion, 切向畸变Tangential…

828华为云征文 | 使用Flexus云服务器X实例部署Kubernetes图形化管理平台

828华为云征文 | 使用Flexus云服务器X实例部署Kubernetes图形化管理平台 1. 基础部署环境说明2. 部署Kubernetes环境3. 部署Kubernetes Dashboard4. 创建登录账号token5. 访问Kubernetes Dashboard 1. 基础部署环境说明 Kubernetes作为当今最流行的容器编排平台&#xff0c;随着…

【Kubernetes】常见面试题汇总(七)

目录 20.简述 Kubernetes 创建一个 Pod 的主要流程&#xff1f; 21.简述 Kubernetes 中 Pod 的重启策略&#xff1f; 20.简述 Kubernetes 创建一个 Pod 的主要流程&#xff1f; Kubernetes 中创建一个 Pod 涉及多个组件之间联动&#xff0c;主要流程如下&#xff1a; &#…

如何让Google收录我的网站?

其实仅仅只是收录&#xff0c;只要在GSC提交网址&#xff0c;等个两三天&#xff0c;一般就能收录&#xff0c;但收录是否会掉&#xff0c;这篇内容收录了是否有展现&#xff0c;排名&#xff0c;就是另外一个课题了&#xff0c;如果不收录&#xff0c;除了说明你的网站有问题&…

人工智能赋能千行百业

人工智能将赋能千行百业 人工智能&#xff08;AI&#xff09;作为当今科技领域的核心驱动力之一&#xff0c;正以前所未有的速度和广度赋能千行百业&#xff0c;深刻改变着我们的生产、生活方式以及社会经济的运行模式。以下是人工智能在多个行业中的赋能作用的几个关键方面&am…

QT多个界面

主函数 #include "widget.h" #include "second.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;Second s;QObject::connect(&w,&Widget::my_signals,&s,&Second::my_slots);w.…

全面质量管理知识竞赛题库

全面质量管理知识竞赛题库 第 1 章 质量 三、单项选择题 1.根据 ISO9000 标准的定义&#xff0c;“质量”是指“客体的一组固有特性满足要求的程度”&#xff0c;以下&#xff08; B &#xff09;不属于产 品的“固有特性”。 A.产品的寿命 B.产品的价格 C.产品制造和使用的…

民宿|基于java的民宿推荐系统(源码+数据库+文档)

民宿推荐系统 目录 基于java的民宿推荐系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 前台&#xff1a; 后台&#xff1a; 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌…

react-问卷星项目(1)

学习的一位MOOC老师的经验&#xff0c;记录一下学习的过程 本项目技术栈&#xff1a;React18TS4AntDesign5Next.js13 项目&#xff1a;低代码&#xff0c;B/C react官方文档 核心价值&#xff1a; 组件化&#xff1a;不是React原创&#xff0c;但在React中流行开来 数据驱…

怎么用python打开文件

python文件读写文件是最常见的IO操作。Python内置了读写文件的函数&#xff0c;用法和C是兼容的。 读写文件前&#xff0c;我们先必须了解一下&#xff0c;在磁盘上读写文件的功能都是由操作系统提供的&#xff0c;现代操作系统不允许普通的程序直接操作磁盘。 读写文件就是请…