【LeetCode】136. 只出现一次的数字
136. 只出现一次的数字
知识点:哈希表;set;消消乐;位运算
题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例
解法一:哈希表
统计次数 --> 哈希表
依次用哈希表存储每个数字出现的次数。 然后遍历哈希表看谁等于1就可以了。
时间复杂度:O(N);
空间复杂度:O(N);
解法二:排序搜索
直接排序,然后比较相邻的两个元素是否相等,每次走两步;
时间复杂度:O(N);
解法三:Set
遇到唯一这种字眼,下意识的就要想到set。如果遇到存在的,就移除,不存在的就加入,最后剩的就是了。
解法四:栈
通过栈去两两抵消:要入栈的元素等于栈顶元素,则弹出。否则入栈。
前提:数组进行了排序。
解法五:求和
解法六:位运算
异或运算有几个很重要的性质:
1.任何数和0异或,仍为本身:a⊕0 = a
2.任何数和本身异或,为0:a⊕a = 0
3.异或运算满足交换律和结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b
可以利用第2条和第3条性质将整个数组异或运算,那最后剩下的那个就是只出现一次的。
体会
上面的解法整体上分为2种:一种就是将每个元素出现的次数统计出来,然后我们找到出现一次的;另一种就是将重复的两两抵消,那最后剩下的就是我们要的。其实方法2-6都是用的这种思路,两两抵消.剩下的就是。其中位运算是最快的,而且不用开辟新的空间。
掌握位运算的解决方法:这种题目往往要按位与、按位异或等操作;
异或运算有几个很重要的性质:
1.任何数和0异或,仍为本身:a⊕0 = a
2.任何数和本身异或,为0:a⊕a = 0
3.异或运算满足交换律和结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b
此外还会有左移<<;右移>>等;比如说:
a & 1 : a的其他位全为0,最后一位不变:即取a最后一位;
a | (1 << i) : a的其他位不变,把a的第i位置为1;
(a >> i) & 1 : 取出a第i位上的值;
目前掌握的题型中触发位运算的是:题目中含有出现次数的问题;
相关题目
相关链接
__EOF__

本文链接:https://www.cnblogs.com/Curryxin/p/15054071.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了