有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java一组中两个最小的数

我试图在不使用数组的情况下找到集合中的两个最小数。以下是代码:

Scanner in = new Scanner(System.in);

int N = in.nextInt();
int min = in.nextInt();


for(int i = 1; i < N; i++){
    int a = in.nextInt();

    if(a < min){            
        min = a;
    }
}

System.out.println(min);

它能找到最小的数,但第二小的数没有任何意义

我该怎么做

请注意,我是Java的完全初学者,非常感谢您的简单解释和帮助。)


共 (3) 个答案

  1. # 1 楼答案

    这很简单:

    Scanner in= new Scanner(System.in);
    
        int N = in.nextInt();
        int min,min2 = Integer.MAX_VALUE,Integer.MAX_VALUE;
    
    
        for(int i = 0; i < N; i++){
    
            int a = in.nextInt();
    
            if( a < min){
    
                min = a;
                min2 = min;
            }
            else if( a < min2){
    
                min2 = a;
            }
    
        }
    
    
        System.out.println(min);
        System.out.println(min2);
    
  2. # 2 楼答案

    一般提示:您应该调用Scanner的close方法,最好在try-with-ressources块中调用:

    try(Scanner in = new Scanner(System.in)) {
        // other code here
    }
    

    这样,如果你打开一条流,你就应该关闭它

    解决方案1:

    使用现有代码的最简单方法是跟踪第二个最小的数字:

    Scanner in = new Scanner(System.in);
    
    int N = in.nextInt();
    int min = in.nextInt();
    int sMin = Integer.MAX_VALUE;
    
    for(int i = 1; i < N; i++){
        int a = in.nextInt();
    
        if(a < min){
            sMin = min;
            min = a;
        } else if(a < sMin) {
            sMin = a;
        }
    }
    
    System.out.println(min);
    System.out.println(sMin);
    

    解释1:

    使用新值时可能出现的两种情况是:

    1. 新值小于minsMin。然后必须将min的值设置为smin,然后将min设置为新的最小值
    2. 新值大于min,小于sMin。然后只需将sMin的值设置为新值
    3. 两个最小值都较小。那就什么都不用做了

    解决方案2:

    另一种更通用的方法是使用^{}

    int N = in.nextInt();
    PriorityQueue<Integer> minQueue = new PriorityQueue<>();
    for(int i = 0; i < N; i++) {
        int value = in.nextInt();
        minQueue.add(value);
    }
    int minValue = minQueue.poll();
    int secondMinValue = minQueue.poll();
    

    这样,通过使用调用poll()方法的循环,可以得到给定的n最小数。(n可以是一个数字<;N


    解释2:

    优先级队列是一种数据结构,它按照自然顺序对给定元素进行内部排序。对于整数,这个顺序由<>=给出。因此,当调用poll()时,移除PriorityQueue遇到的最小元素

  3. # 3 楼答案

    这个问题可以通过多种方式解决,选择正确解决方案的第一步是决定什么对你最重要:

    1. 空间效率,即使用尽可能少的存储空间。ThreeFx这样做,(s)他只为变量NaminsecondMin使用恒定的额外空间。“恒定空间”意味着存储的数据量不取决于要从流中读取的数字数量。相比之下,Tarlen使用线性空间,存储从流中读取的所有数字。这意味着所需的空间量与N成正比,而不是常数
    2. 时间效率,即执行尽可能少的计算。从这个角度来看,我相信ThreeFx的解决方案是最有效的。Tarlen的解决方案会慢一点,因为管理优先级队列可能需要更多的比较
    3. 可扩展性,即当需求发生轻微变化时,修改代码的容易程度。假设你的老板让你解决你刚刚发布的问题,找到两个最小的数字。第二天,他想要前三个,以此类推,直到周末。你厌倦了每天修改你的代码,所以你写了一个通用的解决方案,它将适用于他要求的任何数量的元素。这就是塔伦的解决方案更好的地方
    4. 可读性,即代码的简短易懂程度。我将在这里介绍我自己的解决方案,它基于一个简单的想法:将所有数字放在一个列表中,排序,然后取出前两个数字。请注意,对于资源来说,这是相当浪费的:空间是线性的(我存储的是N个数字),时间效率最多是O(N logn)。这是我的代码:
    List<Integer> list = new ArrayList<Integer>(); 
    for (int i = 0; i < N; i++) list.add(in.nextInt()); 
    Collections.sort(list); 
    System.out.println(list.get(0));
    System.out.println(list.get(1));