在数组中找到重复的数字

时间:2014-06-29 04:11:35

标签: java

我试图在数组中找到重复的数字,但它不起作用。

public class FindDuplicateNumber {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int[] arr={10,20,30,40,40,25};

        int[] duplicate=duplicateNumber(arr);

        for(int dup : duplicate ){
            System.out.println("duplicate elements are:\t"+ dup);
        }
    }

    public static int[] duplicateNumber(int[] arr){
        int[] duplicate = new int[arr.length];
        for(int i=0;i<=arr.length-1;i++){
           if(arr[i]==arr[++i]){
                duplicate[i]= arr[i];
            }
        }
        return duplicate;
    }
}

3 个答案:

答案 0 :(得分:1)

永远不要在循环中使用++ii++ ,除非您真的想跳过正在迭代的数组(或类似)元素之一。

这个

if(arr[i]==arr[++i]){

不同
if(arr[i]==arr[i+1]){

也就是说,永远不要在++i也出现的表达式中使用i++i

<强>后来

您很快就会看到另一个问题是用于保存重复项的数组太长。为此,List更合适。

为什么不起作用

附加增量使循环每隔一个元素跳过,因此永远不会比较这对相邻值40。

答案 1 :(得分:1)

您现在正在使用的算法存在一些问题。

  1. 您在for循环中使用了arr [++ i]。你知道这是做什么的吗?它将i递增1,你的for循环已经做了。因此最后是i ++。因此,当您执行for循环时,您将递增两次并跳过一半的数组值。
  2. 你正在循环遍历数组并将一个值arr [i]与(我假设你要做的是将它与下一个值arr [i + 1]进行比较。)你是吗?看看为什么这不起作用,除非对数组进行了排序?你需要做的是将每个值与数组中的每个其他值进行比较,这将需要2个循环。
  3. 我不想为你编写这段代码,因为我觉得这些提示可以解决这个问题。如果您需要更多帮助,请告诉我。

答案 2 :(得分:0)

您尝试的内容与原始数组不合理。一个原因是你事先并不知道你的重复数组应该有多大。此类问题需要使用可修改的数组类型,例如ArrayList。这是一个使用ArrayList和HashSet的简单版本。

如果已添加数字,则HashSet的.add()方法返回false。

import java.util.HashSet;
import java.util.ArrayList;
import java.util.List;

public class FindDuplicateNumber {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int[] arr={10,20,30,40,40,25};

        for(Integer dup : duplicateNumber(arr)){
            System.out.println("duplicate elements are:\t"+ dup);
        }
    }

    public static List<Integer> duplicateNumber(int[] arr){

        HashSet<Integer> set = new HashSet<Integer>();
        List<Integer> duplicates = new ArrayList<Integer>();

        for (int index = 0; index < arr.length; index++)
            if (!set.add(arr[index]))  // false if already in set.
                duplicates.add(arr[index]); 

        return duplicates;
    }
}