191.位1的个数
//toString(radix),radix表示该数字的基数,如果不设置,就默认基数为10,1011就会被转成11(2^3+2+1)。
var hammingWeight = function(n) {
n= n.toString(2);
let res = 0;
for(let i of n){
i=='1'&&res++;
}
return res;
};
//位运算,减一做位与运算,就能从后往前消除1。
var hammingWeight = function(n) {
let res = 0;
while(n){
n = n&(n-1);
res++
}
return res;
};
461.汉明距离
//暴力
var hammingDistance = function(x, y) {
let res = 0;
while(x!==0||y!==0){
if(x%2!==y%2){
res++;
}
x = Math.floor(x/2);
y = Math.floor(y/2);
}
return res;
};
//位运算
var hammingDistance = function(x, y) {
let s = x^y;
let res = 0;
while(s!==0){
res += s&1;
s>>=1;
}
return res;
};
//Brian Kernighan 算法,跳过了0。
var hammingDistance = function(x, y) {
let s = x^y;
let res = 0;
while(s!==0){
s &= s-1
res++;
}
return res;
};
190.颠倒二进制位
//真的会考位运算吗。res如果不<<<0就会在n=11111111111111111111111111111101时出现负数。
var reverseBits = function(n) {
let res = 0;
for (let i = 0; i < 32 && n > 0; ++i) {
res |= (n & 1) << (31 - i);
n >>>= 1;
}
return res >>> 0;
};
118.杨辉三角
//之前做过了
var generate = function(numRows) {
let res = [];
let init = [1];
res.push(init);
let left=0;
let right=0;
let index = 0;
for(let num=2;num<=numRows;num++){
let store = [];
for(let i=0;i<=res[index].length;i++){
index = num-2;
left = i===0?0:res[index][i-1];
right = i<res[index].length?res[index][i]:0;
store.push(left+right);
}
res.push(store);
}
return res;
};
20.有效的括号
//同上
var isValid = function(s) {
let stack = [];
for(let i of s){
let back = stack.length-1;
if(back<0){ stack.push(i)}
else{
let code1 = stack[back].charCodeAt();
let code2 = i.charCodeAt();
// console.log(code1,code2);
let store = code2-code1;
if(store===1||store===2){
stack.pop();
}
else{
stack.push(i);
}
}
}
return stack.length===0;
};
268.丢失的数字
//就是要自信
var missingNumber = function(nums) {
let n = nums.length;
n = n*(n+1)/2;
for(let i of nums){
n -= i;
}
return n;
};
//太高级了,我直接搬运
var missingNumber = function(nums) {
let res = nums.length;
for(let i in nums){
i = parseInt(i);
res ^= nums[i];
res ^= i;
}
return res;
};