136. 只出现一次的数字 | 刷题打卡

197 阅读1分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述

本题来自1342. 将数字变成 0 的操作次数

image.png

二、思路分析

如题,找一个数组中只出现一次的那个数字。

三、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;
};

四、总结

看过的东西要时常复习