五星级酒店网站建设,大型房地产网站建设方案,手工制作小店铺,网站域名到期后果输入#xff1a;一个正整数n 输出#xff1a;一个数组 规则#xff1a;输出的数组分别表示0xn0xn0xn#xff0c;范围内x的二进制表示中有多少个1。 示例#xff1a;输入2#xff0c;输出[0,1,1]。 分析#xff1a;这道题目很直观。如果计算数字…输入一个正整数n 输出一个数组 规则输出的数组分别表示0xn0xn0xn范围内x的二进制表示中有多少个1。 示例输入2输出[0,1,1]。 分析这道题目很直观。如果计算数字x那就每次把x右移一位看最后一位是不是1。 public int[] countBits(int num) {int[] answers new int[num1];for(int i0;inum;i){int count 0;int r i;for(int j0;j32 r0;j){if(j0){r r1;}if((r 1) 1 ){count;}}answers[i] count;}return answers;}分析2可以考虑是不是在计算4的1个数的时候能不能使用前面计算过的数值。4的二进制100右移一位就是10我们已经计算出dp[2]1dp[4]dp[2]0。 再考虑一个奇数例如5二级制101右移一位就是10我们已经计算出dp[2]1dp[5]dp[2]1。也就是说数值1的1的数量与i2\dfrac{i}{2}2i是有关系的。得出动态转移方程dp[i]dp[i2](i1)dp[i] dp[i2] (i\1)dp[i]dp[i2](i1)。 时间复杂度降到O(n). public int[] countBits(int num) {int[] answers new int[num1];for(int i1;inum;i){answers[i] answers[i1] (i1);}return answers;}