如何检查数组中是否有重复的数字?

时间:2013-10-07 10:21:45

标签: java arrays collections duplicates

我必须找出数组中是否有重复的数字,如果找到重复,我需要-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;
                }
            }
        }
    }
}

6 个答案:

答案 0 :(得分:4)

我建议这一行解决方案:

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.

答案 1 :(得分: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;

答案 2 :(得分: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次,依此类推。如果你想扣除一次,你需要进一步工作。如果你不能这样做,请问我。

提示:您需要维护另一个已标记为重复的数字数组,并添加另一个检查以跳过:)

答案 3 :(得分:0)

要在没有预先排序的情况下在原始数组上的一次迭代中查找重复项,您可以使用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);
       }
    }

答案 4 :(得分:0)

第二个版本,为重复次数扣除一次点数

数组必须只包含此解决方案的正数。

for (int k=0; k < arrNums2.length; k++) 
     {
       if(arrNums2[k] == -1)
       {
         continue;
       }
       Boolean found = fasle;
       for (int i = k+1; i < arrNums2.length; i++) 
       {             
         if(arrNums2[k]==arrNums2[i])
         {  
            if(found == false)
            {            
               points = points -5;
               found = true;           
            }
            arrNums2[i] = -1;
         }
       }
     }

答案 5 :(得分: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;
}