前言
一时想不开,又打开了力扣,你说刷题吧,好像没啥用,优化来的太快就像龙卷风~~ 离不开暴风圈.....跑题了...不刷吧,又感觉马上就被优化,交不起房租,房东让我滚出去~ 还是看看吧,然后,诶,这个,怎么这么好玩?上题目!balabalabala...
题目 136、只出现一次的数字
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间
示例 1 :
输入: nums = [2,2,1]
输出: 1
示例 2 :
输入: nums = [4,1,2,1,2]
输出: 4
示例 3 :
输入: nums = [1]
输出: 1
提示:
1 <= nums.length <= 3 * 104-3 * 104 <= nums[i] <= 3 * 104- 除了某个元素只出现一次以外,其余每个元素均出现两次。
暴力求解
作为一个cv崽,一看题目,哦~~ 完全不懂!但是!不妨碍我用大招,管他什么,先起手一个for循环,纳尼!一个不行,再来一个!先弄出来再说吧,各位,献!丑!啦!如下:
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
// 定义一手长度,待会用
const l = nums.length;
// 给结果声明一手变量
let res = 0;
// 设定一个包含所有计算的对象
const repeat = {}
for(let i = 0;i<l;i++){
const num = nums[i]
if(repeat[num]){ // 如果存在,就加1
repeat[num] = repeat[num]+1
}else{// 如果不存在 就给到1
repeat[num] = 1
}
}
for(let key in repeat){//让我康康哪个是1,就是我要找的啦!
if(repeat[key]==1) res= key
}
// 抛出结果
return res
};
呜呜呜呜😭,先不说符不符合题目给出的复杂度要求,“击败32.83%”js用户深入我心.....
看来,得参考参考大神的解法了(抄....)
异或运算
在JavaScript中,异或运算符用^表示。它需要两个运算数,作为二进制位进行比较。例如,有一个二进制数1010和另一个二进制数1100,它们进行异或运算,得到的结果为0110。
这个位运算,定义是这么定义的:
位运算有下面几个规律
1^1=0;
1^0=1;
0^1=1;
0^0=0;
也就说0和1异或的时候相同的异或结果为0,不同的异或结果为1,根据上面的规律我们得到\
a^a=0;自己和自己异或等于0
a^0=a;任何数字和0异或还等于他自己
a^b^c=a^c^b;异或运算具有交换律
emmm,聪明的同学一定一看就懂,本人就很晕,但是!问题不大,看不明白天书一样的定义,害看不懂代码吗?咱一句一句拆!
首先来个案例[4,1,2,1,2]
再来,起手一个for循环,康康他的成色~
const nums = [4,1,2,1,2];
let result = 0;
for (let i = 0; i < nums.length; i++){
console.log(result)
result ^= nums[i];
}
输出分别是0,4,5,7,6,4!
这是怎么来的呢?!最后刚刚好,就是我们要的4,我滴唯一~ 拆分开来如下
第一步的 0 不用赘述
第二步 0和4异或 会返回本身 对应规律: 任何数字和0异或还等于他自己
第三步 4和1异或 返回5 ,4的二进制100 和 1异或一下,个位数,1和0,结果为1,得到101,就是5啦~
...
那么,计算中的for循环相当于,0^4^1^2^1^2,
0和4异或,会返回本身,即相当于4^1^2^1^2,其中1^2等于0,就只剩4了,一个一个算等于消消乐
4^1的时候是5,4^1^2是7,4^1^2^1等于消去了1则为6,4^1^2^1^2则为6消去了2,最后结果为4,就像打扑克中抽乌龟一样,留下最后一个就是乌龟啦~🐢
到此,这代码写起来就是如下:
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
let result = 0;
for (let i = 0; i < nums.length; i++)
result ^= nums[i];
return result;
};
虽然不像360开机速度一样击败99.99!大神这个解法很好~ 但现在我也会辣!😋
谢谢阅读~如有错误望指正,谢谢