leetcode136:只出现一次的数字
解题思路:
- 哈希
- 异或
- reduce(只是异或的一种简写形式)
1、哈希:如果有则表示不是我们想要的,那就删除 set 中的这个元素,如果没有就将这个元素加入到 set 中。
var singleNumber = function (nums) {
const set = new Set()
for (let i = 0; i < nums.length; i++) {
set.has(nums[i]) ? set.delete(nums[i]) : set.add(nums[i])
}
return [...set][0]
};
2、异或:0与任何数异或结果不变, 两个相同的数异或为0
var singleNumber = function (nums) {
let res = nums[0]
for (let i = 1; i < nums.length; i++) {
res = res ^ nums[i]
}
return res
};
3、reduce:reduce 方法实现的原理也是异或, 我们只是利用它的 API 特性,它刚好能够简化我们第二种方法的代码
//reduce 的中传入的函数的第一个参数 pre 初始值是 0 刚好满足要求
var singleNumber = function (nums) {
return nums.reduce((pre, cur) => pre ^ cur)
};
leetcode137:只出现一次的数字II
解题思路:
- 哈希+求和法
- 双层遍历
var singleNumber = function (nums) {
let set = new Set();
let setsum = 0;
let numsum = 0;
for (let x of nums) {
//所有元素的和
numsum += x;
if (!set.has(x)) {
setsum += x;//2->5
}
//HashSet内元素的和
set.add(x);
}
//返回值
return (3 * setsum - numsum) / 2;
};
//双层循环
var singleNumber = function (nums) {
for (let i = 0; i < nums.length; i++) {
var index = 0
for (let j = 0; j < nums.length; j++) {
if (nums[i] == nums[j]) index++
}
if (index < 3) return nums[i]
}
};
leetcode260:只出现一次的数字 III
解题思路:
这个做法和我们第一题的做法一致, 只要理解了第一题的做法, 这个很容易就能写出来, 有一点不同的是, 第一题的 HashSet 里面最后保留了一个元素, 该题保留两个元素。
位运算会写了再补充
var singleNumber = function (nums) {
let set = new Set()
for (const x of nums) {
set.has(x) ? set.delete(x) : set.add(x)
}
return [...set]
};