题目来源: LeetCode 75 30 天 JavaScript 挑战
2695. 包装数组
代码
js
/**
* @param {number[]} nums
* @return {void}
*/
var ArrayWrapper = function(nums) {
this.arr = nums
};
/**
* @return {number}
*/
ArrayWrapper.prototype.valueOf = function() {
return this.arr.reduce((cur, pre) => cur + pre, 0)
}
/**
* @return {string}
*/
ArrayWrapper.prototype.toString = function() {
return `[${this.arr.join(",")}]`
}
338. 比特位计数
思路
根据二进制奇偶数特性,奇数一定比前面那个偶数多一个 1; 偶数中 1 的个数一定和除以 2 之后的那个数一样多
代码
js
/**
* @param {number} n
* @return {number[]}
*/
var countBits = function(n) {
let res = Array(n + 1).fill(0)
for(let i = 1; i <= n; i++) {
if (i % 2 === 1) {
res[i] = res[i - 1] + 1
} else {
res[i] = res[i/2]
}
}
return res
};
136. 只出现一次的数字
思路
位运算,由于题目告诉了其他数字都出现了两次,所以使用异或算法,将相同的数字变成 0
代码
js
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
let ans = 0
for(let n of nums) {
ans ^= n
}
return ans
};
1318. 或运算的最小翻转次数
思路
模拟法,先声明一个变量记录操作数,如果 a 和 b 的第一位或操作不等于 c 的第一位,ab 都需要操作就加 2,否则加 1;abc 都进行右移 1 位的操作,直到三个数都为 0。
代码
js
const minFlips = (a, b, c) => {
let ret = 0;
while (a > 0 || b > 0 || c > 0) {
if (((a & 1) | (b & 1)) !== (c & 1)) {
ret += (a & 1) === 1 && (b & 1) === 1 ? 2 : 1;
}
a >>>= 1;
b >>>= 1;
c >>>= 1;
}
return ret;
};
本文完,感谢阅读。