제목 설명
음수가 아닌 정수 NUM을 감안할 때. 0 ≤ I ≤ I, 이진수 1 배열로 복귀들을 수를 계산 각 디지털 NUM 범위하십시오.
예 1 :
입력 2
출력 : [0,1,1]예 2 :
입력 : 5
출력 [0,1,1,2,1,2]
고급 :
주어진 시간 복잡도는 매우 쉽게 답을 (를 sizeof (정수) * n)이 O입니다. 하지만 당신은 하나의 통과와 함께 선형 시간 O (N)에서 할 수 있습니까?
알고리즘 복잡도의 공간 요건은 O (N)이다.
당신은 더 솔루션을 향상시킬 수 있습니까? 요청이 작업을 수행 할 수있는 내장 함수 (예를 들어,에서 __builtin_popcount C ++)에서 C ++ 또는 다른 언어를 사용하지 않습니다.
아이디어 분석
처음에는 시간이 너무 오래 알고도, 카운트 ++로 동작의 번호와, 비트 연산에 의해 각을 생각 해결했다.
두번째 생각이 0이 1,1- 위치 0 및 0에서 1의 우측 위치로 직접 첨가하고, 최하위 비트가 0 또는 1이고 결정 0 ... 중간 세트의 절반에 기록 된 상기와 동일한 복잡성 알고
마지막으로, 홀수 짝수에 해당하는있는 법을 찾을 앞 +1,1 +1 직접이기도합니다. 짝수 최하위 비트가 0, 0이므로 바로 하나가 변하지 2,1까지의 숫자 당량으로 나눈 지울 경우.
코드 구현
public int[] countBits(int num) {
int[] ret = new int[num + 1];
int count = 0;
for (int i = 0; i <= num; i++) {
if (i % 2 == 1) {
ret[i] = ret[i - 1] + 1;
} else {
ret[i] = ret[i / 2];
}
}
return ret;
}