136. 只出现一次的数字|刷题打卡
create by db on 2021-3-2 22:48:10
Recently revised in 2021-3-2 23:38:36
闲时要有吃紧的心思,忙时要有悠闲的趣味
原题链接136. 只出现一次的数字
题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
通过次数342,567提交次数482,674
思路分析
因为题目要求我们的算法应该具有线性时间复杂度,不使用额外空间,也就是不能使用辅助数组来做。
其中有一句调教很重要——除了某个元素只出现一次以外,其余每个元素均出现两次!
思路一:
这就让我想到了位运算——异或(^)。
tips: 按位“异或”运算符说明
^运算符查看两个表达式的二进制表示法的值,并执行按位异或。该操作的结果如下所示:
0101 (expression1)
1100 (expression2)
----
1001 (结果)
当且仅当只有一个表达式的某位上为 1 时,结果的该位才为 1。否则结果的该位为 0。即两个相等的数相加为0。
思路二:
虽然不能使用辅助数组,但是我们可以一个数组正反两头查啊。
出现两次的元素肯定不在同一位置,出现一次的别管哪头查都在同一位置。找出他来就好了。
AC 代码
题解一:异或运算
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
let res = 0
nums.forEach(el=> {
res ^= el
})
return res
};
题解二:正反查找
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
let res = 0
nums.forEach(el=> {
if(nums.indexOf(el) === nums.lastIndexOf(el)){
res = el
}
})
return res
};
总结
很简单的一道题,柿子先挑软的捏……
三月你好,春暖花开。加油!
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情
后记:Hello 小伙伴们,如果觉得本文还不错,记得点个赞或者给个 star,你们的赞和 star 是我编写更多更丰富文章的动力!GitHub 地址
文档协议
db 的文档库 由 db 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于github.com/danygitgit上的作品创作。
本许可协议授权之外的使用权限可以从 creativecommons.org/licenses/by… 处获得。