Given a nonnegative integer number num. For every number 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].
Общепринятое решение задачи:
int[] bits = new int[num + 1];
for (int i = 1; i <= num; i++) {
bits[i] = bits[i >> 1] + (i & 1);
}
return bits;
Вопрос: почему "i >> 1" ? мы делаем сдвиг в право и как бы смотрим сколько битов было в предыдущей цифре?
но ведь тогда можно было бы просто делать bits[i - 1] и тупо брать предыдущий...
С "i&1" понятно, он сигнализирует нам о том, что в конце текущего числа стоит 1 или 0 и тут надо увеличивать/не увеличивать счетчик