程序员面试金典---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 @ 2023-04-17 21:02  楸枰~  阅读(16)  评论(0)    收藏  举报