有人可以向我解释为什么这种方法有效吗,我已经完成了它的工作,但为什么这样做呢。二进制数有一种模式吗?例如,在i = 3时,为什么res [1] + 1得到2. res [3>> 1] +(3& 1)有助于计算二进制数3?中的1的数量。
代码应该做什么:它有效,所以不用担心。它应该返回一个列表,其中包含每个数字的二进制表示中的1的数量,直到num + 1。并且num总是> = 0.因此对于num = 5,你会得到[0,1,1,2,1,2],其中最后一个索引表示二进制表示为5的1的数量,并且第一个索引是二进制代表为0的那个。
代码:
public int[] countBits(int num) {
int[] res = new int[num+1];
for (int i = 0; i<num+1; i++){
res[i] = res[i >> 1] + (i & 1);
}
return res;
}
这是我无法解决的问题:
res[i] = res[i >> 1] + (i & 1);
编辑 - 这不是作业,所以请完整解释你的答案。这是为了帮助面试。
答案 0 :(得分:1)
int[] res = new int[num+1];
for (int i = 0; i<num+1; i++){
res[i] = res[i >> 1] + (i & 1);
}
return res;
重写为
int[] res = new int[num+1];
for (int i = 0; i<num+1; i++){
x = res[i >> 1];
y = (i & 1);
res[i] = x + y;
}
return res;
创建一个数组以适合答案,+ 1?
每个,从低端开始。
res[0] = res[0] + 0&1 = 0 + 0 = 0;
res[1] = res[0] + 1&1 = 0 + 1 = 1;
res[2] = res[1] + 0&1 = 1 + 0 = 0;
res[3] = res[1] + 1&1 = 1 + 1 = 2;
看看这种模式,我可以看到,由于正确的移位,以及与&amp;屏蔽,它将问题分成2,一个由于迭代顺序而先前已经解决的问题,以及对最后一个问题的检查数字。
假设为8位int,为简洁起见,
1 = 00000001
2 = 00000010
3 = 00000011
将二进制文件拆分为多个部分。
i i>>1 y&1
1 = 0000000 1
2 = 0000001 0
3 = 0000001 1
因此,它获取数组前半部分中1的结果,然后计算最后一位数。
由于迭代次序和数组初始化值,这可以保证有效。
对于值&lt; 0,由于2的恭维它变得毛茸茸,这就是为什么它只适用于值&gt; = 0
答案 1 :(得分:0)
in&#39; res [i] = res [i&gt;&gt; 1] +(i&amp; 1);&#39;
一个数字的结果分为两部分
答案 2 :(得分:0)
希望下表有助于了解发生了什么:)只需我的2美分。
<pre>
--------------------------------
<b>
# 8 4 2 1 >>1 &1 Ans
</b>
-------------------------------
0 0 0 0 0 0 0 0
1 0 0 0 1 0 1 1
2 0 0 1 0 1 0 1
3 0 0 1 1 1 1 2
4 0 1 0 0 2 0 1
5 0 1 0 1 2 1 2
6 0 1 1 0 3 0 2
7 0 1 1 1 3 1 3
8 1 0 0 0 4 0 1
9 1 0 0 1 4 1 2
10 1 0 1 0 5 0 2
11 1 0 1 1 5 1 3
12 1 1 0 0 6 0 2
13 1 1 0 1 6 1 3
14 1 1 1 0 7 0 3
15 1 1 1 1 7 1 4
</pre>