【问题标题】:Find the second smallest and second largest values of a set of number in Java在Java中找到一组数字的第二小和第二大的值
【发布时间】:2014-02-12 00:50:04
【问题描述】:

找出一组数字的第二小和第二大的值。解决方案必须使得这些值可以在输入的单次传递中找到。输入集可能是空的,也可能非常大:大小是先验未知的。

你们能帮我处理流程图和伪代码吗?提前致谢

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

【问题讨论】:

  • 抱歉,我们只会在您尝试过的情况下提供帮助。如果是,请发布您的代码,清楚地说明您面临的问题
  • 你的老师知道你在这里吗?
  • @JqueryLearner 我的想法是我将一组数字从小到大排序,然后最小值之后的值将是第二小的值,与第二大的值相同,站在最大值之前将是第二大值。如果有任何重复,那么将继续进行,直到获得新值。顺便说一句,我不必做任何代码,只要想出画流程图和编写伪代码的想法。
  • @Benj 试试你的方法吧,我的工作很忙,否则我会做的。如果你遇到问题,请询问
  • @JqueryLearner 我对上面所说的想法感到困惑,还是应该尝试使用 4 个变量然后进行比较?感谢您的帮助

标签: java max min


【解决方案1】:

如果您想一次性完成,将输入按排序顺序排列会很容易。如果它按排序顺序,您只需找到大小,然后使用位置 [1] 和 [n-1] 来查找您的号码。

注意:索引从0开始

另外,如果您使用地图或某些不允许重复值的格式,那么您可以直接获取值。无需重复检查。这样一来,你就可以一次性解决了。

【讨论】:

    【解决方案2】:
    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]);
    }
    }
    

    【讨论】:

    • (我知道,我对另一个答案发表了此评论,但我认为它也适用于此)我认为,通过调用 Arrays.sort(),您不符合执行此操作的要求在一次通过'(在一次通过中,对我来说,这意味着它必须是 O(N) 操作 - 任何排序算法[可能基于基数的排序除外] 至少为 O(n log n),并检查每个项目不止一次。
    【解决方案3】:
    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];
        }
    }
    

    【讨论】:

    • 我认为,通过调用 Arrays.sort(),您没有满足“一次性”执行此操作的要求(对我来说,一次性完成意味着它必须是 O(N ) 操作 - 任何排序算法[可能基于基数的排序除外] 至少为 O(n log n),并且对每个项目进行多次检查。
    【解决方案4】:

    我认为其他答案没有抓住重点;如果您需要“一次通过”,那么首先调用排序算法将意味着不止一次通过数据。将数据放入排序集等也是如此。

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

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

    现在考虑如何扩展此逻辑以找到第二大项目:每次查看新数字时要测试什么?它比你最大的数字大吗?它比你的第二大吗?等等

    更新:您将不得不为其中少于两个项目的列表执行一些特殊情况逻辑:对于长度

    【讨论】:

      猜你喜欢
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 2020-05-27
      相关资源
      最近更新 更多