程序员面试金典---8

下一个数

思路:

  1. 求出从最低位的1开始的连续的1的区间
  2. 将此区间全部变为0,并将区间左侧的那个0变为1
  3. 将第1步取出的区间右移,直到剩下的1的个数减少一个
  4. 将第2步和第3步的结果相或
/**
 * @param {number} num
 * @return {number[]}
 */
var findClosedNumbers = function(num) {
    const nextMax = function(num){
        let x = num &-num
        let y = x + num
        return (num & ~ y) / x >> 1 | y
    }

    if(num === 1) return [2, -1]
    if(num === 2147483647) return [-1, -1]
    let max = nextMax(num)
    let min = ~nextMax(~num)
    if(max < 0) max = -1
    return [max,min]
};

整数转换

思路:

  1. n=A^B,可以得到AB有哪几位不同的,即n二进制1的个数,就是AB有几位不同的数量
  2. n=n & (n - 1)可以去掉n二进制的最右边的一个1,可以统计1的数量
/**
 * @param {number} A
 * @param {number} B
 * @return {number}
 */
var convertInteger = function(A, B) {
        let n = A^B
        let count = 0
        while (n) {
        n = n & (n - 1);
        count++;
    }
    return count;
};
posted @   楸枰~  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示