[검지Offer] 40, 수조에 한 번만 나오는 숫자

6831 단어
제목 설명:
하나의 정형수조에서 두 개의 숫자를 제외하고 다른 숫자는 모두 두 번 나타났다.프로그램을 써서 이 두 개의 한 번만 나오는 숫자를 찾아내세요.
문제풀이1:HashMap의 방법으로 하다
 1 import java.util.HashMap;
 2 public class Solution {
 3     public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
 4         //  map,                  map ,  key    
 5         HashMap map = new HashMap();
 6         for(int i=0; i < array.length; i++){
 7             if(map.containsKey(array[i]))
 8                 map.put(array[i],2);
 9             else
10                 map.put(array[i],1);
11         }
12         //  count        
13         int count = 0;
14         for(int i=0; i < array.length; i++){
15             if(map.get(array[i]) == 1){
16                 if(count == 0){
17                     num1[0] =  array[i];
18                     count++;
19                 }else
20                     num2[0] =  array[i];
21             }
22         }
23     }
24 }

 
문제2: 비트 연산 방법으로 하다
비트 연산에서 이차 또는 성질: 두 개의 같은 숫자가 이차 또는 =0, 한 수와 0이 이차 또는 그 자체이다.
 1 /*
 2            ,          ,      ,           ,
。 , ( AB) 。
, A、B , 1, A B 。
1 , 3 , , 3 1。
, , , , 。
, , 。
3 */ 4 public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { 5 int xor1 = 0; 6 for(int i=0; i < array.length; i++) 7 xor1 = xor1^array[i]; 8 // xor1 , 9 int index = 1; 10 while((index & xor1)==0) 11 index = index <<1;// 1 12 int result1 = 0; 13 int result2 = 0; 14 for(int i=0; i < array.length; i++){ 15 if((index & array[i]) == 0) 16 result1 = result1^array[i]; 17 else 18 result2 = result2^array[i]; 19 } 20 num1[0] = result1; 21 num2[0] = result2; 22 }

좋은 웹페이지 즐겨찾기