--40オファーはシリーズを受賞。数字の配列が一度だけ表示されます

Q:2つの数の整数の配列に加えて、他の数字が二回表示されます。これら二つの図が表示されるだけで検索するプログラムを作成してください。
T:
ソート後の比較1.。
2.ハッシュを使用してください。

import java.util.*;
public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        Queue<Integer> arr = new LinkedList<Integer>();
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int i = 0; i < array.length; i++) {
            if (!map.containsKey(array[i])) {
                map.put(array[i], 1);
            } else {
                map.put(array[i], map.get(array[i]) + 1);
            }
        }
        for (int i = 0; i < array.length; i++) {
            if (map.get(array[i]) == 1) {
                arr.add(array[i]);
            }
        }
        num1[0] = arr.poll();
        num2[0] = arr.poll();
        System.out.println(num1[0]);
        System.out.println(num2[0]);
    }
}

3.セットを使用してください。Javaは、あなたが使用することができます。記憶された設定のセットを使用して、セットの値の重複セットを格納しない、add()メソッドは、ブール値を返し、この機能を利用することができます。
コレクションのセットaddメソッドは、すでに繰り返しの数が存在することをセットの数を追加したいとき、そう、そうでない場合はfalseを返し、セットコレクションが重複した値が格納されていない、真の成功したリターンを追加し、虚偽の運用リターンを追加しないであろう次いで、操作を削除すると、セット内に既に存在する同じ数の要素は、パラメータのみの左側に最終コレクションにオーバー通過後アレイ整数渡されたような方法を除去するために追加されます数がありました。

public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        HashSet<Integer> set = new HashSet<Integer>();
 
        for (int i = 0;i < array.length;i++){
            if(!set.add(array[i])){
                set.remove(array[i]);
            }
        }
 
        Object[] temp =set.toArray();
        num1[0] = (int) temp[0];
        num2[0] = (int) temp[1];
    }

3.の使用排他的論理和演算を見つけることができます。この方法は非常に賢いです。(ピザ@おじさんのおかげで)
自然の中でビットごとのXOR:二つの同一または異なる数= 0、および排他的論理和0の数、またはそのもの。
子どもたちはペアがオフセットされているに表示されますので、番号が一度だけ表示されたら、我々は排他的論理和演算に続いて、アレイ内のすべての数字を入れて、どのような残っていることは、一つの番号です。

この考え方によると、我々は二つの数字(私たちはABを仮定)を見て、アレイ一度表示されます。他のすべての数字は、それ自体に排他的であるか、結果がゼロであるので、私たちは第一又は第1のXOR、数字の残りの部分は確かにA、B XORの結果です。
バイナリ1、AとBの異なるビットの性能におけるこの結果 我々は、ビット数が、3が仮定されるビットの第1のいずれかを実行し、2つのグループに分け、元のアレイグループ化基準は3ビット目が1であるかどうかですだから、グループ内で確かに同じ数は、全てのビットと同じ数は同じですが、グループ内で確かに、ではない別の番号次いでXOR続く最初の線に沿って、これらの2つのグループは、残りの二つの結果がデジタルの2つだけが表示されます

    void FindNumsAppearOnce(vector<int> data, int *num1, int *num2) {
        if (data.size() < 2)
            return;
        if (data.size() == 2) {
            *num1 = data[0];
            *num2 = data[1];
        }
        int bitResult = 0;
        for (int i = 0; i < data.size(); i++)
            bitResult ^= data[i];
        //bitResult为AB异或的结果
        int index = 0;
        while (true) {
            //找到第一个1所在的位数,也是区分AB的指标
            if ((bitResult & 1) != 0)
                break;
            bitResult >>= 1;
            index++;
        }
        *num1 = *num2 = 0;
        for (int i = 0; i < data.size(); i++) {
            //将AB分组,分组后异或,异或的最后结果就是AB
            if (isBit1(data[i], index))
                *num1 ^= data[i];
            else
                *num2 ^= data[i];
        }
    }

    bool isBit1(int target, int index) {
        int temp = target >> index;
        return (temp & 1) != 0;
    }

おすすめ

転載: www.cnblogs.com/xym4869/p/12331907.html