整数篇 - 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
原题链接:剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
解析
朴素解法:通过二进制运算,每次右移1位,并逐位对1作与运算即可求出这个数的1的个数
进阶解法:通过 i & (i-1) 求1的个数。 考虑一个二进制数 i = 1100,则 i-1 = 1011,那么 i & (i-1) = 1000,此时就求出了一个为1的位,计数器加一,循环直到 i 为 0,循环次数即为该数二进制的 1 的个数。
对于朴素解法,时间复杂度为 O(n*k),k 为二进制的位数;
对于进阶解法,时间复杂度为 O(n*m),m 为二进制中为1的位数;
代码
朴素解法
class Solution {
public int[] countBits(int n) {
int[] ans = new int[n + 1];
for (int i = 0; i <= n; i++) {
int cnt_One = 0;
int temp = i;
while (temp != 0) {
if ((temp & 1) == 1) {
cnt_One++;
}
temp = temp >> 1;
}
ans[i] = cnt_One;
}
return ans;
}
}
进阶解法
class Solution {
public int[] countBits(int n) {
int[] ans = new int[n + 1];
for (int i = 0; i <= n; i++) {
int cnt_One = 0;
int temp = i;
while (temp != 0) {
temp = temp & (temp - 1);
cnt_One++;
}
ans[i] = cnt_One;
}
return ans;
}
}
写文不易,求个关注,没有关注,点赞也行!