在Java中查找一组数字的第二小和第二大值

时间:2014-01-22 05:24:46

标签: java max min

查找一组数字的第二个最小值和第二个最大值。解决方案必须是在输入的单次传递中找到这些值。输入集可能为空或可能非常大:大小不是先验已知的。

你们可以帮助我使用流程图和伪代码吗?谢谢你的进步

我目前的流程图如下所示:

enter image description here

4 个答案:

答案 0 :(得分:0)

如果您想在一次通过中获得它,那么按排序顺序输入将很容易。如果它按排序顺序,您可以找到大小,然后使用位置[1]和[n-1]来查找您的数字。

注意:索引从0开始

此外,如果您使用的地图或某些格式不允许重复值,则可以直接获取值。无需重复检查。通过这种方式,您可以一次性解决它。

答案 1 :(得分:0)

public class SortingNo {
static int[] removeDuplicates(int arr[]) {    
  java.util.HashSet<Integer> set = new java.util.HashSet<>();
    final int len = arr.length;
    for(int i = 0; i < len; i++){
        set.add(arr[i]);
    }
    int[] whitelist = new int[set.size()];
    int i = 0;
    for (java.util.Iterator<Integer> it = set.iterator(); it.hasNext();) {
        whitelist[i++] = it.next();
    }
    return whitelist;
}

public static void main(String[] args) {        
    int arr[]={2,2,45,5,78,8,78,23};        
    arr=removeDuplicates(arr);        
    java.util.Arrays.sort(arr);//Sorts the specified array of objects into ascending order        
    System.out.println("Smallest:"+arr[0]);        
    System.out.println("2nd Smallest:"+arr[1]);
    System.out.println("Largest:"+arr[arr.length-1]);
    System.out.println("2nd Largest:"+arr[arr.length-2]);
}
}

答案 2 :(得分:0)

private static int[] getSecondMinAndMax(int[] in) {
    if (in == null)
        return new int[0];

    Arrays.sort(in);

    if (in.length > 3) {
        return new int[]{in[1], in[in.length-2]};
    } else if (in.length == 3) {
        return new int[]{in[1], in[1]};
    } else {
        return new int[0];
    }
}

答案 3 :(得分:0)

我认为其他答案都没有提到;如果您需要“一次性完成”,那么首先调用排序算法将意味着不止一次通过数据。将数据放入有序集合等同样

这不是一个完整的答案,而是一个广泛的暗示......

要解决这个问题,请考虑如何解决一个更简单的问题:考虑如何在一次通过中找到最大值 - 从列表中的第一个值开始,然后在列表中查看一个值一段时间 - 每当您看到一个比当前值更大的值时,您将丢弃之前的最大值并保存新的最大值。当您浏览列表时,您还可以与最小值进行比较,并使用新的较小值替换当前最小值。当你到达列表的末尾时,你会在一次通过中找到最大和最小的。

现在想想如何扩展这个逻辑以找到第二大项目:每次查看新数字时,你会测试什么?它比你最大的数字还大吗?它比你的第二大吗?等

更新:你必须为一个包含少于两个项目的列表做一些特殊情况逻辑:这个问题对于长度为&lt;的列表没有意义。 2,所以由你决定如何处理这些输入。 (即你老师想看到什么?)