首页 > 解决方案 > 从数组中获取第一个唯一元素

问题描述

我正在解决 LeetCode 上的问题。即单号

您需要创建一个函数,该函数将数组作为输入并返回数组中唯一不重复的元素。该数组将只包含一个这样的元素。

[2,2,1] //1
[2,3,5,2,3] //5

我已经用下面的代码解决了这个问题。

var singleNumber = function(nums) {
    let obj = {}  
    for(let a of nums){
        obj[a] = obj[a] + 1 || 1;
    }
    for(let key in obj){
        if(obj[key] === 1) return key;
    }
};

但是在提交结果后它说

运行时间:68 毫秒,比单号 JavaScript 在线提交的72.96%快。

我很想知道解决这个问题的更有效方法。

标签: javascriptarraysalgorithm

解决方案


非重复单个数字的经典解决方案(其中数字是整数,重复的数字恰好重复一次)只是计算所有它们的 x 或:

var singleNumber = function(nums) {
    let res = 0;
    for(let x of nums) res ^= x; // shorthand for res = res ^ x
    return res;
};

请注意,显式基于索引的for循环或 a for-ofor.forEach更快或更慢取决于特定的 Javascript 引擎。例如:

var singleNumber = function(nums) {
    let res = 0;
    for(let i=0,n=nums.length; i<n; i++) res ^= nums[i];
    return res;
};

可能for ... of方法更快。


推荐阅读