題目描述:算法
互娛手撕代碼題。優化
統計從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 }