https://leetcode-cn.com/problems/single-number/
描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
分析
一开始遍历了两次,判断是否相等。相等就break里层循环,循环完成之后return 唯一值。这是暴力解法…
var singleNumber = function(nums) {
let obj = {}, len = nums.length, only = nums[0], flag = true
for (var i = 0;i < len;i++) {
if (!flag) {
return nums[i - 1]
}
only = nums[i]
for (j = 0;j < len;j++) {
if (i === j) {
continue
}
if (nums[i] === nums[j]) {
flag = true
break
}
flag = false
}
}
return only
};
其实可以简单一点,把每次出现的值存在一个对象里面。再次出现就delete掉。最后return 该对象里面的唯一值。
(换成其他语言应该就是键值对)
var singleNumber = function(nums) {
let obj = {}, len = nums.length
for (var i = 0;i < len;i++) {
if (obj[nums[i]]) {
delete obj[nums[i]]
continue
}
obj[nums[i]] = true
}
return Object.keys(obj)[0]
}
看到还有用异或解答的,更简单了
var singleNumber = function(nums) {
let only = 0
for(let i=0; i<nums.length; i++) {
only ^= nums[i]
}
return only
}