LeetCode 数据结构基础 - 只出现一次的数字

103 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

只出现一次的数字

原题地址

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

思路分析

方法一

  1. 将数组排序,升序降序都可以;
  2. 遍历数组,比较相邻两个元素,若相同则跳过这两个元素;若不同则返回 nums[i]

方法二

  1. 使用异或运算,两个相同的数做异或运算为0,一个数和0做异或返回的还是数字本身

AC 代码

方法一

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    nums.sort()
    for(let i=0;i<nums.length;i++) {
        if(nums[i] === nums[i+1]){
            i++
        } else {
            return nums[i]
        }
    }
};

结果:

  • 执行结果: 通过
  • 执行用时:72 ms, 在所有 JavaScript 提交中击败了63.93%的用户
  • 内存消耗:43.9 MB, 在所有 JavaScript 提交中击败了19.81%的用户
  • 通过测试用例:61 / 61

方法二

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    return nums.reduce((total, curr)=>{
        return total ^ curr
    }, 0)
};

结果:

  • 执行结果: 通过
  • 执行用时:68 ms, 在所有 JavaScript 提交中击败了75.38%的用户
  • 内存消耗:42.1 MB, 在所有 JavaScript 提交中击败了53.58%的用户
  • 通过测试用例:61 / 61

总结:

百度百科释义:异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。

异或的运算定律

  1. 一个值与自身的运算,总是为 false。 x ^ x = 0
  2. 一个值与 0 的运算,总是等于其本身。 x ^ 0 = x
  3. 可交换性。 x ^ y = y ^ x
  4. 结合性。x ^ (y ^ z) = (x ^ y) ^ z

END