Brian Kernighan 算法:从0到n,每个整数都分别计算它们的二进制中表示1的个数,再返回数组即可,而使用Brian Kernighan 算法的优点是可以在一定程度上进一步提升计算速度。Brian Kernighan算法的原理是:对于任意整数 x,令 x = x & (x−1),该运算将 x 的二进制表示的最后一个 1 变成 0。因此,对 x 重复该操作,直到 x 变成 0,则操作次数即为 x 的「二进制带有1的比特数」。
3、代码演示
publicint[]countBits(int n){// 创建一个大小为n+1的数组来存储结果int[] bits =newint[n +1];// 遍历从0到n的每个数字 for(int i =0; i <= n; i++){// 计算当前数字i的二进制表示中1的个数,并将结果存储在数组中
bits[i]=countOne(i);}return bits;}publicintcountOne(int x){int ones =0;while(x >0){
x &=(x -1);
ones++;}return ones;}
我叫GPT给我写注释,他说我的countOne函数写的不对,问题在于 x &= (x - 1); 这一行。这行代码确实会消除 x 的二进制表示中的最低位的1,但它并不适合用于计数。因为无论你执行多少次这个操作,只要 x 不为0,ones 就会一直增加,即使 x 的某些位原本就是0。应该这样写:
719. 找出第 K 小的数对距离 - 力扣(LeetCode) 数对 (a,b) 由整数 a 和 b 组成,其数对距离定义为 a 和 b 的绝对差值。 给你一个整数数组 nums 和一个整数 k ,数对由 nums[i] 和 nums[j] 组成且满足 0 < i < j < nums.le…