차례
문제 정책
“1에서 n까지 이진수를 생성하는 흥미로운 방법”문제는 숫자 n이 주어졌고 1에서 n까지의 모든 숫자를 이진 형식.
예
3
1 10 11
6
1 10 11 100 101 110
암호알고리즘
1부터 n까지의 이진수 생성은 이진 트리로 볼 수 있습니다. 여기서 1은 트리의 루트이고 모든 노드에는 2 개의 자식이 있습니다. 왼쪽 자식은 숫자 끝에 '0'을 추가하고 오른쪽 자식은 숫자 끝에 '1'을 추가하면됩니다. 아래 이미지를 참조하십시오.
처음 n 개의 이진수를 생성하려면 다음을 수행하십시오. 레벨 순서 순회 의 나무 처음 n 개의 노드를 인쇄합니다.
- q라는 문자열의 대기열을 만듭니다. 변수 합계를 0으로 초기화합니다.
- 트리의 루트 인 대기열에 "1"을 누릅니다.
- 합계가 n보다 작 으면 4 단계와 5 단계를 반복합니다.
- 요소를 튀어 나옴 변발, 인쇄하고 왼쪽 자식 (요소 + "0")과 오른쪽 자식 (요소 + "1")을 대기열로 푸시합니다.
- 합계를 1 씩 증가시킵니다.
설명
1에서 6까지 이진수를 생성해야하는 예를 고려하십시오.
먼저 위 이미지와 같이 트리를 만듭니다. 트리의 루트는 1이고 모든 노드에 대해 왼쪽 자식은 (노드 값 + "0")이고 오른쪽 자식은 (노드 값 + "1")입니다.
트리에서 루트가 1 진수 2의 이진 표현에 해당함을 알 수 있습니다. 루트의 왼쪽 자식은 3의 이진 표현이고 루트의 오른쪽 자식은 2의 이진 표현입니다. 마찬가지로 "의 왼쪽 노드" 4 "는 2의 이진 표현이고"5 "의 오른쪽 노드는 XNUMX의 이진 표현입니다.
따라서 1에서 6까지 숫자의 이진 표현을 인쇄하려면 트리의 처음 6 개 노드를 인쇄하기 만하면됩니다.이 작업은 레벨 순서로 트리를 순회하여 큐를 사용하여 수행 할 수 있습니다.
따라서 출력은
1 10 11 100 101 110
암호
1에서 n까지 이진수를 생성하는 흥미로운 방법에 대한 Java 코드
import java.util.LinkedList; import java.util.Queue; class AnInterestingMethodToGenerateBinaryNumbersFrom1ToN { private static void generateBinaryNumbers(int n) { if (n == 0) { return; } // create a queue of strings Queue<String> q = new LinkedList<>(); // push the root to the queue q.add("1"); // initialize total as 0 int total = 0; // while total is less than n while (total < n) { // remove an element from queue and print it String curr = q.poll(); System.out.print(curr + " "); // add the left and right child of curr to the queue q.add(curr + "0"); q.add(curr + "1"); // increment total total++; } System.out.println(); } public static void main(String[] args) { int n1 = 3; generateBinaryNumbers(n1); int n2 = 6; generateBinaryNumbers(n2); } }
1 10 11 1 10 11 100 101 110
1에서 n까지의 이진수를 생성하는 흥미로운 방법에 대한 C ++ 코드
#include<bits/stdc++.h> using namespace std; void generateBinaryNumbers(int n) { if (n == 0) { return; } // create a queue of strings queue<string> q; // push the root to the queue q.push("1"); // initialize total as 0 int total = 0; // while total is less than n while (total < n) { // remove an element from queue and print it string curr = q.front(); q.pop(); cout<<curr<<" "; // add the left and right child of curr to the queue q.push(curr + "0"); q.push(curr + "1"); // increment total total++; } cout<<endl; } int main() { int n1 = 3; generateBinaryNumbers(n1); int n2 = 6; generateBinaryNumbers(n2); return 0; }
1 10 11 1 10 11 100 101 110
복잡성 분석
시간 복잡성
의 위에), 주어진 대상 요소에 도달 할 때까지 요소를 순회하기 때문입니다. 따라서 알고리즘은 시간상 선형 적입니다.
공간 복잡성
의 위에), 대상 요소보다 작은 요소를 통과했기 때문입니다. 우리는 이러한 요소를 대기열에 넣었으므로 공간 복잡성도 선형입니다.