【C++】题解:三道只出现一次的数字问题

文章目录

  • 只出现一次的数字i
  • 只出现一次的数ii
  • 只出现一次的数iii
  • 总结

本文介绍了三道只出现一次的数字问题的解法,分别是使用异或运算的方法、使用位运算的方法和使用异或运算和位运算相结合的方法。这三种方法都满足了题目中要求的线性时间复杂度和常数额外空间的条件。

只出现一次的数字i

https://leetcode.cn/problems/single-number/description/

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

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

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for (auto num : nums)
        {
            ret ^= num;
        }
        return ret;
    }
};

代码中使用了一个变量ret来记录结果,初始值为0。然后通过一个循环遍历整个nums数组,对ret和当前遍历到的数字进行异或操作(ret ^= num)。由于异或运算的性质,相同的数字异或结果为0,任何数字与0异或仍然为它本身。因此,最终ret的值将会是那个只出现了一次的元素。

只出现一次的数ii

https://leetcode.cn/problems/single-number-ii/description/
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。
在这里插入图片描述

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for (int i = 0; i < 32; ++i) {
            int cnt = 0;
            for (auto& num : nums) {
                cnt += (num >> i) & 1;
            }
            if (cnt % 3) ans |= 1 << i;
        }
        return ans;
    }
};

这段代码是针对 “除某个元素仅出现一次外,其余每个元素都恰出现三次” 的情况,使用位运算来找出那个只出现了一次的元素。

首先定义一个变量ans来记录结果,初始值为0。然后通过两层循环来进行处理。

外层循环遍历32位二进制数的每一位,即从低位到高位逐位处理。内层循环遍历整个nums数组,统计当前二进制位上1出现的次数(cnt += (num >> i) & 1)。因为除了那个只出现一次的元素外,其他元素都出现了三次,所以1出现的次数必然是3的倍数或者0,不会是1或2。

接着判断cnt % 3是否等于1,如果是,则说明那个只出现了一次的元素在当前二进制位上为1,需要将ans的相应二进制位也设为1,即ans |= 1 << i

最终处理完32位二进制数的每一位后,ans就记录了那个只出现了一次的元素的值。

这段代码的时间复杂度为O(32n),其中nnums数组的长度,因为需要对32位二进制数的每一位进行处理;而且没有使用额外的空间,满足了题目中要求的线性时间复杂度和常数级空间的条件。

只出现一次的数iii

https://leetcode.cn/problems/single-number-iii/description/

给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。
在这里插入图片描述

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int xor2 = 0;
        for (auto& num : nums) {
            xor2 ^= num;
        }
        int mask = 1;
        while (!(mask & xor2)) {
            mask <<= 1;
        }
        vector<int> ret(2);
        for (auto& num : nums) {
            if (mask & num) ret[0] ^= num;
            else ret[1] ^= num;   
        }
        return ret;
    }
};

这段代码是用于找出一个整数数组中只出现一次的两个元素。

首先,通过对数组中的所有元素进行异或运算,得到一个结果xor2。由于异或运算满足交换律和结合律,所以所有出现两次的元素都会被抵消为0,最终xor2的值就是两个只出现一次的元素的异或结果

接下来,使用一个变量mask来标记xor2中不为0的最低位。初始时,mask的值为1。通过循环不断左移mask的位置,直到找到xor2中不为0的最低位,即mask & xor2不为0

然后需要找到开始不相同的那个标志位mask,初始化 mask1,表示二进制数的最低位为 1。然后通过一个循环来逐次左移 mask 的位置,直到找到 xor2 中不为 0 的最低位。循环条件 !(mask & xor2) 意味着 maskxor2 进行与运算后结果不为 0,即 maskxor2 的某一位上的比特位为 1

然后,创建一个大小为2vector ret来记录结果。再次遍历nums数组,根据mask与当前数字的与运算结果来将数组中的所有元素分为两组。具体来说,如果mask与当前数字的与运算结果为0,则说明该数字在mask位置上为0,属于第二组;否则,说明该数字在mask位置上为1,属于第一组。

最后,对两个分组分别进行异或运算,得到两个只出现一次的元素,并存入ret数组中。

最终,返回ret数组即可。

这段代码的时间复杂度为O(n),其中nnums数组的长度,因为只对数组进行了两次遍历;而且没有使用额外的空间,满足了题目中要求的线性时间复杂度和常数额外空间的条件。

总结

在第一道题目中,我们使用异或运算来找出只出现一次的元素。由于异或运算的性质,相同的数字异或结果为0,任何数字与0异或仍然为它本身。因此,最终的结果就是那个只出现了一次的元素。

在第二道题目中,我们使用位运算来找出只出现一次的元素。我们遍历32位二进制数的每一位,统计当前二进制位上1出现的次数。由于除了那个只出现一次的元素外,其他元素都出现了三次,所以1出现的次数必然是3的倍数或者0,不会是1或2。最终处理完32位二进制数的每一位后,就能得到只出现一次的元素。

在第三道题目中,我们结合使用异或运算和位运算来找出只出现一次的两个元素。首先,通过对数组中的所有元素进行异或运算,得到一个结果xor2。由于异或运算满足交换律和结合律,所以所有出现两次的元素都会被抵消为0,最终xor2的值就是两个只出现一次的元素的异或结果。然后,使用一个变量mask来标记xor2中不为0的最低位。再次遍历数组,根据mask与当前数字的与运算结果来将数组中的所有元素分为两组。最后,对两个分组分别进行异或运算,得到两个只出现一次的元素。

总之,这三道题目的解法都是比较巧妙的,需要对异或运算和位运算有一定的了解。掌握了这些技巧后,我们可以很快地解决类似的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【教程】自动检测和安装Python脚本依赖的第三方库

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景说明 对于新python环境&#xff0c;要运行某个脚本&#xff0c;可能需要安装很多库&#xff0c;一般可以通过提供的requirements.txt来自动安装。但如果没有这个txt&#xff0c;那就得手动一个一个安装&#…

这一年,熬过许多夜,也有些许收获 | 2023年终总结

大家好&#xff0c;我是小悟 时间如白驹过隙&#xff0c;一如流光匆匆&#xff0c;转瞬即逝。它如同沙漏中的细沙&#xff0c;无声无息地从指间溜走&#xff0c;留给我们无尽的思索。 我们总是无知地忙碌着&#xff0c;而忽略了时间无形的步伐&#xff0c;却发现它已经一去不…

8个plotly绘图技巧

文章目录 什么是Plotlyplolty绘图如何添加标题&#xff0c;及控制标题的颜色和大小&#xff1f;plotly绘图如何自定义x轴和y轴的名称饼图如何同时显示百分比和数值柱状图宽度如何添加注释如何绘制多子图如何添加图例以及控制其颜色、大小、位置等桑基图Python技术资源分享1、Py…

打开3d模型时显示不匹配怎么办---模大狮模型网

当3d模型打开时&#xff0c;显示不匹配的情况可能有以下几个原因和解决方法&#xff1a; 文件格式不匹配&#xff1a;检查您所使用的3D软件是否支持打开该模型文件格式。不同的软件支持不同的文件格式&#xff0c;如果文件格式不匹配&#xff0c;可能无法正确加载和显示模型。尝…

新能源汽车制造设备状态监测:无线温振传感器的应用

随着全球对环境保护的关注度不断增加&#xff0c;新能源汽车的市场需求正在逐步扩大。而为了满足这一需求&#xff0c;新能源汽车制造企业必须依赖高效、可靠的设备来进行生产制造。然而&#xff0c;设备状态的监测与维护对于保证生产线的稳定运行至关重要。无线温振传感器作为…

【JVM篇】Java是如何实现平台无关的?

Java是如何实现平台无关的? ✔️什么是平台无关性✔️平台无关性的实现✔️Java虚拟机✔️字节码✔️Java语言规范 ✔️扩展知识仓✔️平台无关性的好处✔️ 有哪些语言实现了平台无关?✔️Java中基本数据类型的大小都是确定的吗? ✔️什么是平台无关性 平台无关性就是一种语…

dds 问题记录

Q1. 2023.12.29 一个participant内部的数据也会放到topic中进行发布、订阅吗&#xff1f;为什么&#xff1f;如图中的topic3。 (from 车载通信架构 —— DDS协议介绍https://mp.weixin.qq.com/s/IasCCsVJ7w-CHeyXGM6soQ)

Java创建线程执行任务的方法(一)

目录 1.继承Thread类 2.实现Runnab类 2.1实现Runnable类 2.2使用Lambda表达式 3.实现Callable类 3.1返回Integer类型数据 3.2返回String类型数据 3.3返回Object类型数据 4.匿名内部类 创建线程的方法&#xff1a;继承Thread类&#xff1b;实现Runnab类&#xff1b;匿名…

深度解析高防产品---游戏盾

游戏盾是针对游戏行业所推出的高度可定制的网络安全解决方案&#xff0c;游戏盾是高防产品系列中针对游戏行业的安全解决方案。游戏盾专为游戏行业定制&#xff0c;针对性解决游戏行业中复杂的DDoS攻击、游戏CC攻击等问题。游戏盾通过分布式的抗D节点&#xff0c;可以防御TB级大…

归并算法:分治而治的高效算法大揭秘(图文详解)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《数据结构&算法》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 归并算法是我们算法中最常见的算法之一&#xff0c;其思想非常巧妙。本身归并是只能归并有序数组…

迁移Ubuntu报错问题

问题描述&#xff1a; 使用LxRunOffline-v3.5.0-mingw迁移Ubuntu至非系统盘时&#xff0c;出现如下报错 ‘Couldn’t set the case sensitive attribute of the directory “\?\C:\Users\xxx\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\Loc…

Typora使用PicGo+Gitee上传图片报错403 Forbidden

Typora使用PicGoGitee上传图片报错403 Forbidden Typora使用PicGoGitee上传图片&#xff0c;上传失败了&#xff0c;错误信息如下 打开PicGo的日志文件查看&#xff0c;可以看到错误详情如下 换了一个插件github-plus重新配置&#xff0c;解决了这个问题 再打开日志查看&…

ubuntu:beyond compare 4 This license key has been revoked 解决办法

https://www.cnblogs.com/zhibei/p/12095431.html 错误如图所示&#xff1a; 解决办法&#xff1a; &#xff08;1&#xff09;先用find命令找到bcompare所在位置&#xff1a;sudo find /home/ -name *bcompare &#xff08;2&#xff09;进入 /home/whf/.config,删除/bco…

计算机网络——应用层与网络安全(六)

前言&#xff1a; 前几章我们已经对TCP/IP协议的下四层已经有了一个简单的认识与了解&#xff0c;下面让我们对它的最顶层&#xff0c;应用层进行一个简单的学习与认识&#xff0c;由于计算机网络多样的连接形式、不均匀的终端分布&#xff0c;以及网络的开放性和互联性等特征&…

VerticalGridView适配触摸屏踩坑,触摸滑动时位置重置/闪烁问题

VerticalGridView是什么? VerticalGridView是安卓leanback库的列表组件,用于支持使用遥控器(按键事件)浏览列表。 它与RecyclerView的继承关系是:VerticalGridView→BaseGridView→RecyclerView 首先我想吐槽一下leanback的BaseGridView相关组件,耦合度较高,并且不允许开…

DOA估计算法——迭代自适应算法(IAA)

1 简介 迭代自适应法 (Iterative Adaptive Approach&#xff0c;IAA)估计算法最早由美国的电气工程师和数学家Robert Schmidt和Roy A. Kuc在1986年的一篇论文"Multiple Emitter Location and Signal Parameter Estimation"中首次提出了这一算法&#xff0c; IAA DOA …

[LitCTF 2023]作业管理系统

[LitCTF 2023]作业管理系统 信息搜集 进来发现要登录&#xff1a; 但是别着急&#xff0c;先查看源码或者抓个包&#xff1a; 可以看到源码中给出了提示&#xff1a;默认账户admin admin 。 账户名&#xff1a;admin&#xff0c;密码&#xff1a;admin&#xff0c;成功登录。…

腾讯云轻量应用服务器租用优惠价格表(多配置报价)

腾讯云轻量应用服务器优惠价格表&#xff0c;12月最新报价&#xff0c;腾讯云轻量2核2G3M带宽62元一年、2核2G4M轻量服务器118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;756元三年、4核8G12M轻量服务器646元15个月&#xff0c;CVM云服务器S5实例2核2G配置…

Gin 源码深度解析及实现

介绍 什么是 gin &#xff1f; 一个轻量级高性能 HTTP Web 框架。 Introduction | Gin Web Framework (gin-gonic.com) Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API&#xff0c;但性能比 Martini 快 40 倍。 为什么使用 gin &#xff1f; In…

基于CNN和双向gru的心跳分类系统

CNN and Bidirectional GRU-Based Heartbeat Sound Classification Architecture for Elderly People是发布在2023 MDPI Mathematics上的论文&#xff0c;提出了基于卷积神经网络和双向门控循环单元(CNN BiGRU)注意力的心跳声分类&#xff0c;论文不仅显示了模型还构建了完整的…