二、leetcode - 二进制、数学类 (JS)

这篇博客探讨了位操作在计算中的应用,包括计算二进制位1的个数、判断是否为3的幂、寻找数组中只出现一次的数字、计算阶乘后的零以及整数反转。此外,还涉及到了二进制位的翻转和Excel列序号转换为数字的问题。通过实例展示了如何使用位操作高效地解决这些问题。
摘要由CSDN通过智能技术生成
191. 位1的个数
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
每次去掉二进制中的最后一个1
1010 
1000 
0
/**
 * @param {number} n - a positive integer
 * @return {number}
 */
var hammingWeight = function(n) {
    let res = 0;
    while(n) {
        n = (n - 1) & n;
        res++;
        console.info(parseInt(n).toString(2));
    }
    return res;
};
326. 3的幂
输入: n = 27
输出: true
9 
3 
1
输入: n = 45
输出: false
15 
5 
1.6666666666666667
/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfThree = function(n) {
    while(n >= 3) {
        n = n / 3;
        console.info(n);
    }
    return n === 1;
};
136. 只出现一次的数字
输入: [2,2,1]
输出: 1
相同值异或运算为0,与0进行异或运算为原值
res  运算过程
0    2^2=0
1    0^1=1
/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    let res = nums[0];
    for(let i = 1; i < nums.length; i++) {
        res ^= nums[i];
        console.info(res);
    }
    return res;
};
172. 阶乘后的零
输入: n = 5
输出: 1
解释: 5! = 120 ,有一个尾随 0
1
/**
 * @param {number} n
 * @return {number}
 */
var trailingZeroes = function(n) {
    let res = 0;
    while(n > 1) {
        n = (n / 5 | 0);
        res += n;
        console.info(n);
    }
    return res;
};
7. 整数反转
输入: x = -123   输出: -321
输入: x = 120    输出: 21
res=-3   x=-12 
res=-32  x=-1 
res=-321 x=0

res=0  x=12 
res=2  x=1 
res=21 x=0
/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    let res = 0;
    let min = Math.pow(-2, 31);
    let max = Math.pow(2, 31) - 1;
    while(x) {
        res = res * 10 + x % 10; // x % 10: 取10进制的个位数字
        if(res > max || res < min) return 0;
        x = x / 10 | 0; // 取10进制个位以上的数字
        console.info('res='+res+' x='+x);
    }
    return res;
};
171. Excel 表列序号
输入: columnTitle = "AB"
输出: 28
1 
28
/**
 * @param {string} columnTitle
 * @return {number}
 */
var titleToNumber = function(columnTitle) {
    let ans = 0;
    for(let item of columnTitle){
        ans = ans * 26 + (item.charCodeAt() - 'A'.charCodeAt() + 1);
        console.info(ans);
    }
    return ans;
};
190. 颠倒二进制位
输入:n = 00000010100101000001111010011100
输出:964176192 (00111001011110000010100101000000)
解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
     因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
32次循环,一次挪动一位
0 - 1010010100000111101001110 
0 - 101001010000011110100111 
1 - 10100101000001111010011 
11 - 1010010100000111101001 
111 - 101001010000011110100 
1110 - 10100101000001111010 
11100 - 1010010100000111101 
111001 - 101001010000011110 
1110010 - 10100101000001111 
11100101 - 1010010100000111 
111001011 - 101001010000011 
1110010111 - 10100101000001 
11100101111 - 1010010100000 
111001011110 - 101001010000 
1110010111100 - 10100101000 
11100101111000 - 1010010100 
111001011110000 - 101001010 
1110010111100000 - 10100101 
11100101111000001 - 1010010 
111001011110000010 - 101001 
1110010111100000101 - 10100 
11100101111000001010 - 1010 
111001011110000010100 - 101 
1110010111100000101001 - 10 
11100101111000001010010 - 1 
111001011110000010100101 - 0 
1110010111100000101001010 - 0 
11100101111000001010010100 - 0 
111001011110000010100101000 - 0 
1110010111100000101001010000 - 0 
11100101111000001010010100000 - 0 
111001011110000010100101000000 - 0 
964176192
/**
 * @param {number} n - a positive integer
 * @return {number} - a positive integer
 */
var reverseBits = function(n) {
    let result = 0
    for (let i = 0; i < 32; i++) {
        result = (result << 1) + (n & 1); // 获取二进制最后一位,并不断左移
        n = n >> 1; // 原二进制数不断右移
        console.info(parseInt(result).toString(2)+' - '+parseInt(n).toString(2));
    }
    // 为什么要 >>> 0 呢,一位javascript没有无符号整数,全是有符号的
    // 不>>>0的话,得出来的值是负数,但是无符号整数是没有符号的
    // javascript 有符号转化为无符号的方法就是>>>0
    console.info(result >>> 0);
    return result >>> 0;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值