删除重复项并找到最大的元素

时间:2014-01-02 06:00:45

标签: java

带有重复项和整数N的整数列表。从列表中删除重复项,找到修改后列表中的第N个最大元素。

实现至少两种不同的解决方案,以Big-O表示法找到具有O(N * log(N))平均时间复杂度的第N个最大元素,其中N是列表中元素的数量

以下是我想到的解决方案是否有更好的实施方式?另外,我如何实现两种不同的解决方案?

public static void main(String[] args) {
    // TODO Auto-generated method stub      
    int[] list= {5,3,8,2,5,7,6,7,3,7};
    int n = 3;

    System.out.println("Printing list before removing duplicates");
    for (int i : list) {
        System.out.println(i+" ");
    }

    for (int i = 0; i < list.length; i++) {
        for (int j = i+1; j < list.length; j++) {
            if (list[i] < list[j]) {
                int swap = list[i];
                list[i] = list[j];
                list[j]=swap;
            }
            if (list[i] == list[j]) {
                    list[j] = 0;
            }
        }
    }
    System.out.println("Printing list after removing duplicates");
    for (int i : list) {
            System.out.println(i+" ");
    }
    System.out.println("the N-th largest element in the modified list is"+ list[n-1]);
}

3 个答案:

答案 0 :(得分:3)

对于这类问题,你真的需要看看为你提供了哪些语言工具,以及如何利用它们为你做出艰苦的工作。

要删除重复项,只需将它们放入Set即可。要对它们进行排序,请使用TreeSet

所以你得到:

Set<Integer> values = new TreeSet<Integer>();

这会将它们从最小到最大排序,以反转顺序为TreeSet指定你自己的比较器,它只是反转自然顺序。

然后迭代Set,迭代器返回的第n个值就是你的值。

您当前的代码看起来大部分都是有效的,但它实际上并没有删除重复项 - 您需要实际从数组中删除内容,而数组不支持而不重新创建它们,因为它们无法调整大小。此外,如果您包含0或负数,它将会混淆。例如,( - 3,-5,-6,-6)中的最大数字将返回为0。

答案 1 :(得分:0)

如果您从集合开始,每个任务一行。

List<Integer> list = new ArrayList<Integer>(Arrays.asList(5,3,8,2,5,7,6,7,3,7));

删除重复项:

List<Integer> nodups = new ArrayList<Integer>(new HashSet<Integer>(list));

找到最大的:

Integer largest = Collections.max(list);

答案 2 :(得分:0)

除非出于某种原因你只能使用原语,Tim的答案解决了排序问题。要实现多个“解决方案”,只需创建两个不同的函数,它们将数字列表和值n作为参数:

public void firstSolution(int[] numbers, int n) {
// one implementation
}

public void secondSolution(int[] numbers, int n) {
// another implementation
}

然后只需在main中进行适当的函数调用。