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

我建议这个单行解决方案:

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

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

我将所有元素添加到一个集合中,根据定义它拒绝重复。然后我将集合的大小与数组的长度进行比较,并将结果乘以 5。

于 2013-10-07T13:11:17.867 回答
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,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 回答
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

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

第二个版本,多次重复扣分一次

对于此解决方案,数组必须仅包含正数。

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;
         }
       }
     }
于 2013-10-07T11:25:30.963 回答