• LeetCode 338


    Given a non negative integer number num.
    For every numbers i in the range 0 ≤ i ≤ num
    calculate the number of 1's in their binary representation
    and return them as an array.

    Example:
    For num = 5 you should return [0,1,1,2,1,2].

    Follow up:
    It is very easy to come up with a solution with run time O(n*sizeof(integer)).
    But can you do it in linear time O(n) /possibly in a single pass?
    Space complexity should be O(n).
    Can you do it like a boss?
    Do it without using any builtin function like __builtin_popcount in c++
    or in any other language.

    Hint:
    You should make use of what you have produced already.
    Divide the numbers in ranges like [2-3], [4-7], [8-15] and so on. And try to generate new range from previous.
    Or does the odd/even status of the number help you in calculating the number of 1s?

     1 /*************************************************************************
     2     > File Name: LeetCode338.c
     3     > Author: Juntaran    
     4     > Mail: Jacinthmail@gmail.com
     5     > Created Time: 2016年05月10日 星期二 02时33分02秒
     6  ************************************************************************/
     7 
     8 /*************************************************************************
     9     
    10     Given a non negative integer number num. 
    11     For every numbers i in the range 0 ≤ i ≤ num 
    12     calculate the number of 1's in their binary representation 
    13     and return them as an array.
    14 
    15     Example:
    16     For num = 5 you should return [0,1,1,2,1,2].
    17 
    18     Follow up:
    19     It is very easy to come up with a solution with run time O(n*sizeof(integer)). 
    20     But can you do it in linear time O(n) /possibly in a single pass?
    21     Space complexity should be O(n).
    22     Can you do it like a boss? 
    23     Do it without using any builtin function like __builtin_popcount in c++ 
    24     or in any other language.
    25     
    26     Hint:
    27     You should make use of what you have produced already.
    28     Divide the numbers in ranges like [2-3], [4-7], [8-15] and so on. And try to generate new range from previous.
    29     Or does the odd/even status of the number help you in calculating the number of 1s?
    30 
    31  ************************************************************************/
    32 
    33 #include "stdio.h"
    34 
    35 /**
    36  * Return an array of size *returnSize.
    37  * Note: The returned array must be malloced, assume caller calls free().
    38  */
    39  
    40 /*
    41 思路:
    42     1:2的次幂都是1
    43     2:非2的次幂,比如9,找前一个2的次幂比如8,做差,其二进制中1的个数为差+1
    44 */
    45 int isPowerOfTwo(int n)
    46 {
    47     double tmp = log10(n)/log10(2);
    48     return tmp == (int)tmp ? 1 : 0;
    49 }
    50 
    51 int * countBits(int num, int* returnSize)
    52 {
    53     int *result = malloc(sizeof(int)*(num+1));
    54     result[0] = 0 ;
    55     int last = 0 ;
    56     int i;
    57     for( i=1 ; i<= num; i++ )
    58     {
    59         if(isPowerOfTwo(i))
    60         {
    61             result[i] = 1 ;
    62             last = i;
    63         }
    64         else
    65         {
    66             result[i] = result[i - last] + 1 ;
    67         }
    68 //        printf("%d ",result[i]);
    69     }
    70     *returnSize = num+1 ;
    71     return  result;
    72 }
    73 
    74 int main()
    75 {
    76     int* returnSize;
    77     countBits(5,returnSize);
    78     
    79     return 0;
    80 }
  • 相关阅读:
    git rebase 的使用
    一分钟带你学会利用mybatis-generator自动生成代码!
    手把手带你实战下Spring的七种事务传播行为
    SpringBoot系列-整合Mybatis(注解方式)
    SpringBoot系列-整合Mybatis(XML配置方式)
    Java中打印日志,这4点很重要!
    SpringBoot集成JWT实现权限认证
    一分钟带你了解JWT认证!
    利用SpringBoot+Logback手写一个简单的链路追踪
    SpringBoot中如何优雅的读取yml配置文件?
  • 原文地址:https://www.cnblogs.com/Juntaran/p/5479113.html
Copyright © 2020-2023  润新知