2

配列内に重複する数字があるかどうかを確認する必要があり、重複が見つかった場合は -5 ポイントする必要があります。これまでの私のコードは次のとおりです。

for (int k = 0; k < arrNums2.length; k++) 
{
    for (int i = 0; i < arrNums2.length; i++) 
    {
        if (arrNums2[k] == arrNumsCompare[i])
        {             
            points = points - 5;            
            for (int j = 0; j < arrNums2.length; j++)
            {
                if (arrNums2[k] == arrNums2[j])
                {
                    arrNums2[j] = 0;
                }
            }
        }
    }
}
4

6 に答える 6

4

この1行のソリューションをお勧めします:

Integer[] numbers = {1,2,3,4,5,6,5,4,3,2,1};

return 5 * (new HashSet<Integer>(Arrays.asList(numbers)).size() - numbers.length);

すべての要素を Set に追加しますが、これは定義により重複を拒否します。次に、セットのサイズと配列の長さを比較し、結果に 5 を掛けます。

于 2013-10-07T13:11:17.867 に答える
0

この疑似コードで作業できます。

int nDuplicates = 0;
arrNums2 = arrNums2.Sort(); // Sort the array in ascending or descending order. 

for(int i =1; i<arrNums2.size(); ++i)
{ 
 if(arrNums2[i-1] == arrNums2[i])
 {
  nDuplicates++;
 }
}
Point -= nDuplicates*5;

編集:入力 5,5,5,5 を単一の重複と見なす必要がある場合は、次のスニペットを使用します。

    int nDuplicates = 0;
    arrNums2 = arrNums2.Sort(); // Sort the array in ascending or descending order. 
    int DuplicateNumber = 0;
       for(int i =1; i<arrNums2.size(); ++i)
        { 
         if(arrNums2[i-1] == arrNums2[i])
         {
          if(DuplicateNumber != arrNums2[i])
          {
           nDuplicates++;
           DuplicateNumber = arrNums2[i];
          }
         }
        }
     Point -= nDuplicates*5;
于 2013-10-07T10:41:37.463 に答える
0

このループは、負の値の制限に達するまで永遠に続くようです。arrNumsCompareロジックを実装するために一時配列を作成したようです。どうぞ:

   for (int k=0; k < arrNums2.length; k++) 
     {
       for (int i = 0; i < arrNums2.length; i++) 
       {
         if(i == k)
         {
           i++;
         } 
         if(arrNums2[k]==arrNums2[i])
         {             
            points = points -5;
            break;
         }
       }
     }

注:値が 3 回存在する場合、控除は 10 などになります。一度控除したい場合は、さらに作業を行う必要があります。それができない場合は、私に尋ねてください。

ヒント:既に重複としてマークされている数値の別の配列を維持し、スキップする別のチェックを追加する必要があります:)

于 2013-10-07T10:45:41.850 に答える
0

事前の並べ替えを行わずに、元の配列に対して 1 回の反復で重複を見つけるには、HashMap を使用して各エントリを格納し、再度見つけるたびにカウントをインクリメントします。
このようにして、最初の重複を見つけたらすぐに処理を停止するか、すべてを検索し続けることができます...

編集: http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

Hashmap entries  = new Hashmap<Integer, Integer>();
    for (int k = 0; k < arrNums2.length; k++) {
       if (!entries.containsKey(arrNums2[k])) {
         entries.put(arrNums2[k], 1);
       } else {
         // You already found the duplicate, so you can do whatever you like 
         Integer count = entries.get(arrNums2[k]);
         count = count + 1;
         entries.put(arrNums2[k], count);
       }
    }
于 2013-10-07T10:49:39.170 に答える
0

セット {1,2,3,4,5,5,5,5,6,7,8,9,9,9,9} の場合、ポイントが 100 である場合、次のコードはポイントを 10 減らします。重複が 2 つしかない場合。お役に立てれば。

private int[] numbers;
private Set<Integer> previousDuplicates = new HashSet<Integer>();
private int points;


public void reducePointsForDuplicates(){
    for (int i = 0; i < numbers.length; i++) {
         reducePointsIfDuplicate(i, numbers[i]);
    }
}

private void reducePointsIfDuplicate(int position, int number){
    for (int i = position + 1; i < numbers.length; i++) {
        if(number == numbers[i]){ 
            reducePointsForNewDuplicate(number);
        }
    }
}

private void reducePointsForNewDuplicate(int number){
    if (!previousDuplicates.contains(number)){
        points = points - 5;
    }
    previousDuplicates.add(number);
}



public int[] getNumbers() {
    return numbers;
}

public void setNumbers(int[] numbers) {
    this.numbers = numbers;
}

public int getPoints() {
    return points;
}

public void setPoints(int points) {
    this.points = points;
}
于 2013-10-07T11:53:48.527 に答える