我正在解决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%”更快。
我很想知道解决这个问题的更有效方法。
答案 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]))