手撕代碼:統計1到n二進制數中1出現的總次數

題目描述:算法

互娛手撕代碼題。優化

統計從1到n這n個數的二進制表示中1出現的次數。spa

 

思路分析:code

思路一:直接的作法是從1遍歷到n,對於每一個數和1作與操做,以後,對於這個數不斷作右移操做,不斷和1作與操做,直到當前數爲0。這樣的算法複雜度爲O(nlogn)。blog

思路二:優化時間複雜度,那麼考慮用空間換時間。利用n&(n-1)這個操做能夠去掉末尾的1。利用遞推f(n) = 1+f(n&(n-1))。這樣就是利用空間來換時間,時間複雜度爲O(n)。class

 

代碼:遍歷

思路一:二進制

 1 int numZeros(int n)
 2 {
 3     int res=0;
 4     for(int i=1; i<=n; i++)
 5     {
 6         while(i>0)
 7         {
 8             if(i&1==1)
 9                 res++;
10             i = i>>1;
11          }   
12     }
13     return res;
14 }

 

思路二:統計

 1 int numZeros(int n)
 2 {
 3     vector<int>f(n+1, 0);
 4     int res=0;
 5     for(int i=1; i<=n; i++)
 6     {
 7         f[i] = 1+f[i&(i-1)];
 8         res += f[i];
 9     }
10     return res;
11 }
相關文章
相關標籤/搜索