从数组中获取第一个唯一元素

时间:2019-04-27 07:33:52

标签: javascript arrays algorithm

我正在解决LeetCode上的问题。即Single Number

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

[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%”更快。

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

3 个答案:

答案 0 :(得分:2)

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

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

请注意,是基于显式索引的for循环还是for-of.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方法快。

答案 1 :(得分:0)

您必须使用XOR逻辑来检查唯一编号,因为在问题描述中提到每个元素都出现两次,除了一个。 A XOR A为0。此属性有助于确定唯一编号。

var singleNumber = function(nums) {
    return nums.reduce((prev, curr) => prev ^ curr, 0)
};

答案 2 :(得分:0)

此代码应执行以下操作:

function getUniqueEl(arr) {
  for (let i = 0; i < arr.length; i++) {
    let temp = arr.lastIndexOf(arr[i]);
    if (temp !== i) {
      delete arr[temp];
    } else {
      return arr[i];
    }
  }
}
     
console.log(getUniqueEl([2, 2, 1]))