Leetcode 136: 只出现一次的数字

【LeetCode】第136题——只出现一次的数字(难度:简单) 【LeetCode】第136题——只出现一次的数字(难度:简单)题目描述解题思路代码详解思路一思路二注意点 题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 示例 1: 输入: [2,2,1] 输出: 1 示例 2: 输入: [4,1,2,1,2] 输出: 4 你可以不使用额外空间来实现吗? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problem 阅读详情

题目描述

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

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

我的代码

解法1:先进行sort排序

class Solution {
    static bool cmp(const int &a, const int &b){
        return(a<b);
    }
public:
    int singleNumber(vector<int>& nums){
        sort(nums.begin(), nums.end(), cmp);
        int i;
        for(i=0; i<nums.size() - 1; i+=2){
            if(nums[i] != nums[i+1]){return nums[i];}
        }
        return nums[i];
    }
};

解法2:利用map(但是我的思路不对,代码见下)

我的想法是把nums容器中的元素作为键存进哈希表,在每一个新元素存进来之前判断一下哈希表中有没有键等于这个元素的值,如果有的话则删除这个键,没有的话把这个值作为键存进来。最后得到的是唯一一个键值对,然后返回该值。

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        unordered_map<int, int> m;
        for(int i=0; i<nums.size(); i++){
            auto it = m.find(nums[i]);
            if(it == m.end()){
                m[nums[i]] = nums[i];
            }
            else{
               m.erase(it); 
            }
        }
        return m[0];
    }
};

程序运行结果:
测试容器是nums={2,2,1},执行结果是输出为0。

分析:代码中最后的返回不对,m[0]的意思是取键为0的值,并不是取出此关联容器map中的第一个元素,它并不是序列容器。当然这里并未存放等于0的键,因此0键对应的值就为默认初始化的0。

解法2:正确地使用map(运行时间和占用内存是硬伤)

若第一次出现,将此值存为键,值为1
第二次出现,将此键对应的值改为2
最后for循环查找值为1的键

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        map<int,int> n;
        int ans = 0;
        for(int i = 0; i < nums.size(); ++ i){
            n[nums[i]] == 1? n[nums[i]] = 2: n[nums[i]] = 1;
        }
        for(int j = 0; j < nums.size(); ++ j){
            if(n[nums[j]] == 1)  ans = nums[j];
        }
        return ans;
    }
};

解法3:用set

若第一次出现,插入哈希集
第二次出现,冲哈希集内删除
最后剩下的就是那个只出现一次的数字

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        unordered_set<int> s;
        int a;
        for(auto i: nums){
            if(s.count(i)){s.erase(i);}
            else{s.insert(i);}
        }
        for(auto i: s){a = i;}
        return a;
    }
};

解法4: 黑科技——异或

任何一个数字异或它自己都等于0。也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些出现两次的数字全部在异或中抵消掉了。并且异或操作不受先后顺序的影响。

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int a = nums[0];
        for(int i = 1; i<nums.size(); i++){a = a ^ nums[i];}
        return a;
    }
};
【简单】力扣算法题解析LeetCode136:只出现一次的数字 本文介绍了如何在非空整数数组中找到只出现一次的元素(其他元素均出现两次),要求使用线性时间复杂度和常量空间。通过异或运算的归零律、恒等律和交换律,将所有元素异或后,成对元素抵消为0,最终结果即为目标元素。Java实现通过遍历数组进行异或运算,时间复杂度O(n),空间复杂度O(1)。 阅读详情

相关推荐

DDR内存接口深度解析:从寻址机制到FPGA时序约束实战

在高速数字系统设计中,内存接口是决定系统性能与稳定性的关键。DDR(双倍数据速率)技术通过在时钟的上升沿和下降沿传输数据,实现了带宽的倍增,广泛应用于消费电子、通信设备和工控主板等领域。其核心原理在于利用三维存储阵列(Bank、Row、Column)的分级寻址机制,通过先进行行激活、再进行列访问的固定时序,实现高速数据吞吐。理解这一寻址顺序是进行精准时序分析的基础。在工程实践中,FPGA作为内存控制器,需通过严谨的时序约束(如set_input_delay)来确保信号在高速传输下的建立与保持时间要求,从而将

weixin_29192211的博客 196

LeetCode136(力扣136):只出现一次的数字 (C++)

136.只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,1] 输出: 1 示例 2: 输入: [4,1,2,1,2] 输出: 4 我的题解(错误错误错误) class Solution { public: int singleNumber(vector<int>& nums) { so

VegetableGirl的博客 442

Windows显卡TDR超时导致Unity崩溃?手把手教你修改注册表延长响应时间

本文详细解析了Windows显卡TDR超时导致Unity崩溃的问题,并提供了修改注册表延长响应时间的完整解决方案。通过调整TdrDelay和TdrDdiDelay键值,开发者可以有效避免D3D11设备丢失错误,提升Unity编辑器的稳定性。文章还包含显卡驱动优化、系统性能调优等实用技巧,帮助开发者彻底解决编辑器崩溃问题。

weixin_33737774的博客 623

Leetcode136(力扣136):只出现一次的数字

方法一:利用异或的性质 class Solution { public: int singleNumber(vector<int>& nums) { int res=0; for(auto i:nums) { res=res^i; } return res; } }; 方法二:常规的map容器使用 class Solution { public: int singleNumb

weixin_44537258的博客 271

Windows本地化部署Dify完整指南

本文详细介绍了在Windows系统上本地化部署Dify的完整步骤,涵盖了Docker Desktop的安装与配置、Dify源代码的获取、环境变量的设置、服务的启动与管理、以及常见问题的解决方案。文章首先指导用户如何下载和安装Docker Desktop,并配置WSL 2功能。接着,详细说明了如何获取Dify源代码,并通过Docker Compose启动服务。文章还提供了高级配置指南,包括如何配置大语言模型和更新Dify版本。最后,针对Docker镜像拉取失败等常见问题,提供了详细的诊断和解决方案。通过本文,

jacky_zhuyuanlu的博客 1万+

ADS 使用调整器动态调参教程(Tuning)

ADS动态调参教程

weixin_42845306的博客 1万+

LeetCode136:只出现一次的数字

LeetCode136:只出现一次的数字题目说明分析代码1代码2 题目说明 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,1] 输出: 1 示例 2: 输入: [4,1,2,1,2] 输出: 4 分析 常规思路是利用,非空整数数组...

坚果 219

hwasan / asan详细分析踩内存之一:Use after free

UAF漏洞全称为use after free ,即利用已经被free掉的堆块被再次利用,该漏洞的存在是因为程序编写者在free堆块部分没有将该堆块的fd指针改为0,进而导致该堆块可以被申请回来,3.内存块被free后,其对应的指针没有被设置为 NULL,但是在它下一次使用之前,有代码对这块内存进行了修改,那么当程序再次使用这块内存时,就很有可能会出现奇怪的问题。2.堆块free后,对应指针没有被设置为NULL,即还可以调用会该堆块,当我们申请一个比该堆块小于等于的size时。

1398

LeetCode 136: 只出现一次的数字

目录LeetCode 136: 只出现一次的数字题目描述解题异或 LeetCode 136: 只出现一次的数字 题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 【示例 1]】 输入: [2,2,1] 输出: 1 【示例 2】 输入: [4,1,2,1,2] 输出: 4 解题     思路I:排序,对整个数组排序,寻找与左右两边都不相同的那个数字。     思路I

s_Shune 217

Halcon那些事:Halcon缺陷检测检测印刷数字完整性

创建模板 create_shape_model模板匹配 find_shape_model。

十多年IT经验,专注机器视觉,智能制造半导体行业 764

RK3588 Android12 添加HDMI和喇叭声音通道切换选项

rk3588 android12系统默认接hdmi out时,声音会切换到hdmi out输出,主板声卡喇叭输出会没有声音输出。现在添加一个选项设置hdmi out时,声音可以保持主板声卡喇叭输出。

Android系统开发笔记 4163

leetcode 136:只出现一次的数字(python)

腾讯精选练习(50 题)Day31 || leetcode 136:只出现一次的数字(python)

nanashi_F的博客 298

【毕设全程指导】基于YOLOv8的包装商品检测与可视化系统(SKU110K实战)

本文介绍了一个基于YOLOv8的包装商品检测与可视化系统毕业设计方案。项目采用SKU110K数据集,通过CSV转TXT格式转换适配YOLO模型训练,包含详细的环境搭建、模型配置和训练流程。系统实现了包装商品的自动化检测,并开发了Tkinter可视化界面进行交互式检测展示。该方案结合产业应用需求与技术深度,既具备实用价值,又能充分展示学生的技术能力,适合作为计算机视觉相关专业的毕业设计选题。整个项目从数据准备到界面开发完整覆盖,帮助学生系统掌握目标检测项目的完整实现流程。

LXY_LOVE36的博客 147

力扣(LeetCode)题解:136. 只出现一次的数字 golang实现

题目描述 136. 只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 解题思路 方法一:我首先想到的当然是双重循环一下,然后然后得到唯一的数字。这样这是常规操作。 方法二:位运算,当我不满足我的用时的时候,准备去看题解的时候,发现了一个线索,什么? 因为题目让我不要使用额外的空间,所有我就不用哈希,那么这个位运算,有点印象,与或非啥的。模模糊糊的,还可以计算数?然后去百度,发现新大陆,强啊,太棒了。 选取位运算中的异或来解决本题。

鱼爻 563

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

LeetCode第 136 题:只出现一次的数字(C++)

136. 只出现一次的数字 - 力扣(LeetCode) 要求线性时间复杂度,如果使用额外空间(比如哈希表set/map)的话,就很简单。 class Solution { public: int singleNumber(vector<int>& nums) { int sum = 0; unordered_set<int> set; for(int i = 0; i < nums.size(); ++i){

zj 477

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

力扣第136题:只出现一次的数字 巧用异或

通过利用异或运算的特性,这道题可以在OnO(n)On时间复杂度内解决,而且只需要O1O(1)O1的空间复杂度。异或操作的特性使得我们能够快速找到只出现一次的元素,非常高效。

weixin_48941116的博客 953

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

LeetCode136:只出现一次的数字

LeetCode136:只出现一次的数字 标签:位运算、哈希表 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/single-number 解法一:暴力法 直接每个挨...

Burger 142

LeetCode 136:只出现一次的数字

LeetCode 136:只出现一次的数字题目描述解题思路代码实现总结 题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,1] 输出: 1 示例 2: 输入: [4,1,2,1,2] 输出: 4 解题思路 将数组所有元素进行异或运算...

香农三定律的博客 168

力扣136 :只出现一次的数字

暴力查找 public int singleNumber(int[] nums) { int numLength = nums.length; int[] count = new int[numLength]; //新创建一个数组用来记录nums数组中元素出现的次数 int target = 0; //将只出现一次的数字放在此变量中 for (int i = 0; i < numLength; i++) { .

是小D吖!的博客 404

力扣136:只出现一次的数字

题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 : 输入: [2,2,1] 输出: 1 输入: [4,1,2,1,2] 输出: 4 力扣题目链接 题目思路: 不使用额外的空间进行统计次数,我们采用位运算进行解决:异或运算有以下三个性质: 任何数和0做异或运算结果仍然是原来的数;即:a ^ 0 = a; 任何数和自身做异或运算,结果仍然是原来的数,即:a

qq_44851228的博客 222

LeetCode第136题:只出现一次的数字

LeetCode第136题:只出现一次的数字 问题描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,1] 输出: 1 示例 2: 输入: [4,1,2,1,2] 输出: 4 解题思路 出现两次的元素,进行二进制的异或运算之...

朕蹲厕唱忐忑的博客 200

leetcode每日一题.136:只出现一次的数字

题目描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/single-number 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 示例1: 输入: [2,2,1] 输出: 1 示例2: 输入: [4,1,2,1,2] 输出: 4 分析: 直

FarStars的博客 403

Leetcode136:只出现一次的数字

文章目录Leetcode133:只出现一次的数字题目描述思路分析代码实现面试题56-I:数组中数字出现的次数题目描述思路分析代码实现 Leetcode133:只出现一次的数字 题目描述 思路分析 题目大意是除了一个数字出现一次,其他都出现了两次,让我们找到出现一次的数。我们执行一次全员异或即可。 代码实现 package LeetCode; public class SingleNumber...

sparky的博客 211

leetcode:136. 只出现一次的数字

题目来源 leetcode 题目描述 题目解析 关键点在于两两相消 使用set 题目中让我们在线性的时间复杂度内求解,那么一个非常直接的思路就是使用 HashSet,利用其常数级的查找速度。遍历数组中的每个数字,若当前数字已经在 HashSet 中了,则将 HashSet 中的该数字移除,否则就加入 HashSet。这相当于两两抵消了,最终凡事出现两次的数字都被移除了 HashSet,唯一剩下的那个就是单独数字了 class Solution { public int singleNumber(i

OceanStar的博客 486

LeetCode第136题:只出现一次的数字(简单)

LeetCode第136题:只出现一次的数字(简单) 题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 解题思路:用HashMap存储是很容易想到的方法,但是题目要求不能使用额外的空间。所以我选择了排序的方法。 class Solution { public int singleNumber(int[] nums) { Arrays.sort(n

new_whiter的博客 462
上一篇: Leetcode 217:存在重复元素
下一篇: ubuntu vscode配置C++的 .json文件
冀州少主
博客等级 码龄8年 16粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值