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