题目:只出现一次的数字
leetcode链接:初级算法 - 只出现一次的数字
说明:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素
理解:
1、有一个非空数组,数组里有一个只出现一次以及多个出现2次的元素
2、找出仅出现一次的那个元素
思路:
1、使用异或运算,因为相同数字进行异或运算后结果为0,如:1 ^ 1 = 0;而0和其它数字进行异或运算后得到的还是那个数字
2、使用中间变量打标(boolean),取出值为true的key
3、利用set元素不重复特性删除重复元素,剩下就是只出现依次的数组元素
4、先对数组排序,然后利用奇偶数位置作判别
题解:
方案一:对数组元素进行异或运算,最终那个剩下的数字即为只出现一次的数组元素
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
var reduce = 0;
for (var i = 0; i < nums.length; i++) {
reduce = reduce ^ nums[i];
}
return reduce;
};
方案二:
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
var obj = {};
for (var i = 0; i < nums.length; i++) {
if (!obj[nums[i]]) {
obj[nums[i]] = true
} else {
obj[nums[i]] = false
}
}
for (var key in obj) {
if (obj[key]) {
return key
}
}
};
方案三:
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
var set = new Set();
for (var i = 0; i < nums.length; i++) {
if (set.has(nums[i])) {
set.delete(nums[i])
} else {
set.add(nums[i])
}
}
return [...set][0]
};
方案四:利用奇偶数位置
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
nums.sort((n1, n2) => n1 - n2)
// 排序之后只需要奇数位置和奇数位置+1对比即可,如果相等证明前一个不相等,如果全不相等证明在最后一个
for (var i = 1; i < nums.length - 1; i += 2) {
if (nums[i] === nums[i+1]) {
return nums[i - 1]
}
}
return nums[nums.length - 1]
};
总结:
上面几种题解中,方案一如果了解的话,从代码层面来看是最简单的,但总体来说,效率似乎都不大高的样子