1

这是检查整数数组是否包含重复项的正确方法吗?我想传入一个 int[] nums 而不是 Integer[],但无法让它工作。

public static boolean isUnique(Integer[] nums){
    return new HashSet<Integer>(Arrays.asList(nums)).size() == nums.length;
}
4

2 回答 2

4

您可以执行以下操作:

public static boolean isUnique(int[] nums){
    Set<Integer> set = new HashSet<>(nums.length);

    for (int a : nums) {
        if (!set.add(a))
            return false;
    }

    return true;
}

这比你所拥有的更像是一种短路式的方法,一旦遇到重复就返回。更不用说它可以int[]按照您的意愿使用。我们正在利用一个事实,即Set#add返回一个布尔值,指示正在添加的元素是否已经存在于集合中。

于 2013-10-25T15:15:55.923 回答
0

无论是Set还是排序在这里都无关紧要,排序更优化,对象更少。

public static boolean isUnique(int[] nums) {
    if (nums.length <= 1) {
        return true;
    }
    int[] copy = Arrays.copyOf(nums);
    Arrays.sort(copy);

    int old = Integer.MAX_VALUE; // With at least 2 elems okay.
    for (int num : copy) {
        if (num == old) {
            return false;
        }
        old = num;
    }
    return true;
}

附录正如评论所言,速度较慢,但​​可以节省内存。

于 2013-10-25T15:22:35.507 回答