-2

配列内の重複アイテムの数を数えようとしています。

例:

[0, 2, 0] would return 2, [0, 0, 0] would return 3, [0, 1, 2] = 0

これまでのところ、3 つの項目がすべて等しい場合に機能していますが、2 つの項目が同じである場合よりも 1 つ少ない値を返す理由がわかりません。

    int equal = 0;

    for(int i = 0; i < recent.length; i++) {
        for(int j = i; j < recent.length; j++) {
            if(i != j && recent[i].equals(recent[j])) {
                equal++;
            }
        }
    }
4

8 に答える 8

1

あなたのアルゴリズムには次のような欠陥があります。配列内のすべての要素について、その要素の後のすべての要素を調べ、それらが等しい場合はカウンターを増やします。ただし、3 つの同じ要素がある場合、最初の要素と 2 番目の要素に対して内部ループを実行すると、最後の要素が 2 回カウントされます。さらに、最初の要素を数えることはありません。

したがって、偶然に機能し[0, 0, 0]ますが、他の入力では機能しません。

于 2012-12-01T09:27:00.250 に答える
1

あなたが与えたコードは同等性を数えるので、要素が別の要素と等しいたびに1つ追加されます。

あなたが望むのは、(長さ - 重複を持たないアイテムの数)と同じ重複アイテムの数であるように聞こえます。後者を「uniqueItems」と呼びます。

次のことをお勧めします。

// set of every item seen
Set<Integer> allItems = new HashSet<Integer>();
// set of items that don't have a duplicate
Set<Integer> uniqueItems = new HashSet<Integer>();

for(int i = 0; i < recent.length; i++) {
    Integer val = i;
    if(allItems.contains(val)) {
        // if we've seen the value before, it is not a "uniqueItem"
        uniqueItems.remove(val); 
    } else {
        // assume the value is a "uniqueItem" until we see it again
        uniqueItems.add(val);
    }
    allItems.add(val);
}
return recent.length - uniqueItems.size();
于 2012-12-01T09:28:34.900 に答える
1

ネストされたループを持つことは非常に非効率的だと思います。o(n^2) ではなく o(n) で実行できるはずです。

あなたが次のことに対してあなたの時間を計るなら...

public void run() {
    int[] array = createRandomArray(2000000, 1000000);
    System.out.println(countNumDups1(array));
}


private int[] createRandomArray(int numElements, int maxNumExclusive) {
    int[] array = new int[numElements];
    Random random = new Random();
    for (int i = 0; i < array.length; i++) {
        array[i] = random.nextInt(maxNumExclusive);
    }
    return array;
}

private int countNumDups1(int[] array) {
    Map<Integer, Integer> numToCountMap = new HashMap<>();
    for (int i = 0; i < array.length; i++) {
        Integer key = array[i];
        if (numToCountMap.containsKey(key)) {
            numToCountMap.put(key, numToCountMap.get(key) + 1);
        }
        else {
            numToCountMap.put(key, 1);
        }
    }
    int numDups = 0;
    for (int i = 0; i < array.length; i++) {
        Integer key = array[i];
        if (numToCountMap.get(key) > 1) {
            numDups++;
        }
    }
    return numDups;
}

オートボクシングとオブジェクト作成の恐ろしい非効率性を考慮しても、上記の方がはるかに高速であることがわかると思います。

于 2012-12-01T10:02:25.180 に答える
0
    public void TotalduplicateNumbers {
    int a[] = {2,8,2,4,4,6,7,6,8,4,5};
    Map<Integer,Integer> m = new HashMap<Integer,Integer>();
    for(int i=0;i<a.length;i++){            

            if(!m.containsKey(a[i]))
            {
                m.put(a[i], 1);
            }
            else
            {
                m.put(a[i], (m.get(a[i])+1));
            }

    }

    for(Integer i:m.keySet()){
        System.out.println("Number "+i+" "+"Occours "+m.get(i)+" time,");
    }
}

11 個の数字を含む配列があります。ロジックは、これらの数字を使用してマップを作成することです。map の KEYS は、ユーザーが入力する必要がある実際の番号であり、no. その実際の番号の発生の。そのキーの値になります。ここで、containsKey() メソッドは、マップにそのキーが既に含まれているかどうかをチェックし、適用されたブール値 true または false を返します。含まれていない場合は、そのキーをマップに追加し、対応する値を 1 にする必要があります。それ以外の場合、キーは既に含まれています。 get() を使用してそのキーの値を取得し、それを 1 増やします。最後にマップを出力します。

出力: -

2番が2回、4番が3回、5番が1回、6番が2回、7番が1回、8番が2回、

于 2014-09-17T10:11:38.230 に答える
0
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;


public class ArrayDuplicateCount {

    /**
     * @author:raviteja katari
     */
    public static void main(String[] args) {
        int intArray[] = {5, 1,4,4,4,5,1,2,1,2,5,5};  


        //for counting duplicate items
        int c = 0;

        //creating map collection to hold integers as keys and Cont as value
        Map<Integer, Integer> nwmap = new LinkedHashMap<Integer, Integer>();  

        for (int i = 0; i <intArray.length; i++) {

            //Assigning array element to key 
            Integer key = intArray[i];

                //this code checks for elemnt if present updates count value else 
                //put the new Array elemnt into map and increment count

                if(nwmap.containsKey(key)){

                    //updating key value by 1 
                    nwmap.put(key, nwmap.get(key) + 1);

            }else{

                //Adding new array element to map and increasing count by 1
                  nwmap.put(key, c+1);


                   }

                           }
          //printing map
        System.out.println(nwmap);
    }

}

出力: {5=4, 1=3, 4=3, 2=2}

于 2014-08-10T08:34:04.613 に答える
0

等しい値を持つインデックスのペアの数を数えています。あなたが望むと主張するのは、複数の要素を持つ等しい要素のすべてのセットの合計サイズです。

Map などを使用して、特定の値の合計出現回数を数えます。最後に、複数の出現を持つ各キーの出現回数を追加して、キー値を反復処理します。

于 2012-12-01T09:33:27.443 に答える
0
int intArray[] = {5, 1, 2, 3, 4, 5, 3, 2};  

String val = "";

int c = 1;

Map<Integer, Integer> nwmap = new HashMap<Integer, Integer>();  

for (int i = 0; i < intArray.length; i++) {

    Integer key = intArray[i];

        if(nwmap.get(key) != null && nwmap.containsKey(key)){

        val += " Duplicate: " +String.valueOf(key)+"\n";

    }else{

        nwmap.put(key, c);

            c++;

    }

}

LOG.debug("duplicate value:::"+val);
于 2013-03-26T17:48:12.297 に答える