题目一:只出现一次的数字 I
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
方法一:位异或 XOR
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) { // XOR 运算满足交换律和结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b
let ans = 0;
for(const num of nums) {
ans ^= num; // 00000 0010 ^ 00000 0010 = 0000 0010
}
return ans;
};
方法二:
var singleNumber = function(nums) {
let set = new Set();
for(let i = 0 ,lenght = nums.length ; i< lenght ; i++ ) {
if(set.has(nums[i])) {
set.delete(nums[i]); // 第二次出现的数都会被删除
continue;
}
set.add(nums[i]);
}
return [...set];
};
题目二: 只出现一次的数字 II
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2]
输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]
输出: 99
方法一:循环+indexOf
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
for(let i=0;i<nums.length;++i){
if(nums.indexOf(nums[i],i+1)==-1&&nums.indexOf(nums[i])==i){ // 存在一个
return nums[i]
}
}
};
方法二:排序+数学
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
nums.sort((a,b)=>a-b);
for(let i=0;i<nums.length;i+=3){
if(nums[i] != nums[i+1]) return nums[i];
}
};
总结
- 这种类型的题目,可以借助javascript的语法去解决,或者借助数学的方式解决。并没有特别好的数据结构和算法去解决。