本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述
二、思路分析
如题,找一个数组中只出现一次的那个数字。
三、AC代码
我这有6种解法,依次是:
1.异或 (之前特意了解过这里,还给哥哥们分享过,md忘了又去看了一遍)
var singleNumber = function(nums) {
let ans = nums[0];
for(let i = 1; i< nums.length; i++) {
ans^=nums[i];
}
return ans;
};
异或:二进制位的两个数相同为0,不同为1。
2.暴力法
var singleNumber = function(nums) {
for (let i = 0; i < nums.length; i++) {
if (nums.lastIndexOf(nums[i]) === nums.indexOf(nums[i])) return nums[i];
}
};
3.遍历把数组中每一项放到对象中,已存在的删掉,最后留下的就是有唯一值的那个数
var singleNumber = function(nums) {
let numsObj = {};
for (let i = 0; i < nums.length; i++) {
if (numsObj[nums[i]]) delete numsObj[nums[i]];
else numsObj[nums[i]] = 1;
}
return Object.keys(numsObj)[0];
4.分隔字符串
var singleNumber = function(nums) {
const numsStr = `/${nums.join('//')}/`;
for (let i = 0; i < nums.length; i++) {
if (numsStr.split(`/${nums[i]}/`).length === 2) return nums[i];
}
};
5.先排序再暴力
var singleNumber = function(nums) {
nums = nums.sort();
for (let i = 0; i < nums.length; i++) {
if (nums[i] !== nums[i - 1] && nums[i] !== nums[i + 1]) return nums[i];
}
};
6.数学法 (看评论区大哥写的,我再悟一会儿)
结果 = 只出现一次的数字总和*2 - 所有数字的总和
var singleNumber = function(nums) {
var sumOfSet = 0, sumOfNums = 0;
var set = {};
for(let v of nums)
{
if(set[v] == undefined)
{
sumOfSet += v;
set[v] = 1;
}
sumOfNums += v;
}
return 2*sumOfSet - sumOfNums;
};
四、总结
看过的东西要时常复习