程序员面试金典---8
下一个数
思路:
- 求出从最低位的1开始的连续的1的区间
- 将此区间全部变为0,并将区间左侧的那个0变为1
- 将第1步取出的区间右移,直到剩下的1的个数减少一个
- 将第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] };
整数转换
思路:
n=A^B,可以得到A和B有哪几位不同的,即n二进制1的个数,就是A和B有几位不同的数量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; };

浙公网安备 33010602011771号