9 도 OJ 1351 배열 에 한 번 밖 에 안 나 오 는 숫자.

2097 단어 배열
제목 주소: http://ac.jobdu.com/problem.php?pid=1351
 
제목 설명:
하나의 정형 배열 에 두 개의 숫자 를 제외 하고 다른 숫자 는 모두 두 번 나 타 났 다.프로그램 을 써 서 이 두 개의 한 번 만 나 오 는 숫자 를 찾 아 보 세 요.
입력:
모든 테스트 사례 는 두 줄 을 포함한다.
첫 번 째 줄 은 하나의 정수 n 을 포함 하고 배열 의 크기 를 나타 낸다.2<=n <= 10^6。
두 번 째 줄 은 n 개의 정 수 를 포함 하고 배열 요 소 를 나타 내 며 요 소 는 모두 int 입 니 다.
출력:
모든 테스트 사례 에 대응 하여 출력 배열 에 한 번 만 나타 나 는 두 개의 수 입 니 다.출력 된 숫자 는 작은 것 부터 큰 것 까지 의 순서 입 니 다.
샘플 입력:
8

2 4 3 6 3 2 5 5

샘플 출력:
4 6
#include <stdio.h>

 

unsigned int FindFirstBitIs1 (int num){

    int indexBit = 0;

 

    while ((num & 1) == 0 && indexBit < 32){

        num >>= 1;

        ++indexBit;

    }

    return indexBit;

}

 

int IsBit1 (int data, unsigned int indexof1){

    data >>= indexof1;

    return data & 0x01;

}

 

void FindNumsAppearOnce (int data[], int n, int * num1, int * num2){

    int result = 0;

    int i;

 

    for (i=0; i<n; ++i){

        result ^= data[i];

    }

    unsigned int indexof1 = FindFirstBitIs1 (result);

    *num1 = 0;

    *num2 = 0;

    for (i=0; i<n; ++i){

        if (IsBit1 (data[i], indexof1))

            *num1 ^= data[i];

        else

            *num2 ^= data[i];

    }

}

 

int main(void){

    int n;

    int input[1000000];

    int i;

    int num1;

    int num2;

 

    while (scanf ("%d", &n) != EOF){

        for (i=0; i<n; ++i)

            scanf ("%d", &input[i]);

        FindNumsAppearOnce (input, n, &num1, &num2);

        if (num1 < num2)

            printf ("%d %d
", num1, num2); else printf ("%d %d
", num2, num1); } return 0; }

 
참고 자료: 하 해도 - 프로그래머 면접 문제 정선 100 문제 (34) - 배열 에 한 번 밖 에 나 오지 않 는 숫자 [알고리즘]

좋은 웹페이지 즐겨찾기