비트 수 (338)

제목 설명

음수가 아닌 정수 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;
    }
게시 된 117 개 원래 기사 · 원 찬양 8 · 전망 3688

추천

출처blog.csdn.net/qq_34761012/article/details/104608372