我是靠谱客的博主 想人陪小蝴蝶,最近开发中收集的这篇文章主要介绍剑指offer 专项突破版 3、前 n 个数字二进制中 1 的个数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目链接

思路

  • 思路一
    最简单的思路就是每一个数字单独算二进制下1的个数
    注意有一种简便算法就是利用 i & i-1 来让i最右侧的1变为0 所以说 i & i-1比i的二进制1的位数少1 利用这个规律可以快速的算出n在二进制下1的个数

    public class Solution {
    public int[] countBits(int n) {
    int[] result = new int[n + 1];
    for (int i = 0; i <= n; i++) {
    int count = 0, j = i;
    while (0 != j) {
    result[i] += 1;
    j &= j - 1;
    }
    }
    return result;
    }
    }
    

    这种解法注意

    1. 要引入变量j 而不能更新i
    2. while循环的判断条件是 0 != j
  • 思路二
    既然i & i-1比i的二进制1的位数少1 而我们的result数组保存的就是二进制形式1的位数 那么自然有result[i] = result[i&i-1]+1

    public class Solution {
    public int[] countBits(int n) {
    int[] result = new int[n + 1];
    for (int i = 0; i <= n; i++) {
    result[i] = result[i & i - 1] + 1;
    }
    return result;
    }
    }
    
  • 思路三
    思路三主要是对于规律的寻找 我们知道在二进制情况下 左移1位等价于乘2,所以对于i,必有result[2*i] = result[i]
    那么对于result[2 * i+1],则可以看成result[i]先左移1位再+1,因为此时刚左移结束,最低为一定是0,所以不会产生进位,所以result[2 * i+1] = result[2 * i]+1

    public class Solution {
    public int[] countBits(int n) {
    int[] result = new int[n + 1];
    for (int i = 1; i <= n; i++) {
    result[i] = result[i >> 1] + (1 & i);
    }
    return result;
    }
    }
    

最后

以上就是想人陪小蝴蝶为你收集整理的剑指offer 专项突破版 3、前 n 个数字二进制中 1 的个数的全部内容,希望文章能够帮你解决剑指offer 专项突破版 3、前 n 个数字二进制中 1 的个数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部