首页 > 解决方案 > Java程序在控制台输入中查找第二小的数字

问题描述

我真的很想抓住这个问题,但没有帮助就无法继续下去。我的逻辑是有序的,但由于某种原因它无法正确执行。

在执行时,我想输入一行数字,例如 10 12 5 9 3,程序应该返回第二小的数字。因为我想首先控制基础知识,所以我避免使用任何其他导入的类,除了使用的两个。

如果有人能解释为什么这不起作用,我将不胜感激。

package secondSmallest;

import java.util.Scanner;
import java.io.PrintStream;

public class secondSmallest {

    public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    PrintStream out = new PrintStream(System.out);
    
    int smallest = 1;
    int secsmallest = 0;
    int hold = 0;
    
    while(scan.hasNext()); {
        
        hold = scan.nextInt();
        
        if (hold < smallest) {
            smallest = secsmallest;
            smallest = hold;
            
            
        } else {
            hold = scan.nextInt();
        }
        
    out.printf(" %d", secsmallest);
    }
    }
}

标签: javaeclipse

解决方案


首先:

我的逻辑是有序的,但由于某种原因它无法正确执行。

意味着您的逻辑不正常(除非只是拼写错误或其他语法错误,从而阻止了完美的结果);


第二:

Scanner#hasNext(),你有一个while条件:

如果此扫描器在其输入中有另一个标记,则返回 true。此方法可能会在等待输入扫描时阻塞。扫描仪不会超过任何输入。

你应该在某个地方以某种方式指出你希望while循环何时结束。在您的示例中,您的循环正在无限进行,因为它没有任何基本情况。连“回车”键都是数据,按一下会一直输入换行控制字符;


第三:

您将最小的初始化为1,这并不是一个将常量静态分配给当前最小值的干净设计。当您的输入不同时,请考虑一种可能性;


第四:

您正在打印secsmallest您的 while 循环内部,我想这不是您想要做的;


第五:

通过在你的else块中阅读,你hold = scan.nextInt();实际上是在省略一个输入,因为当你的 while 向前迭代一步时,你就有了另一个hold = scan.nextInt(); and you jump one iteration


第六:

有很多方法可以设计“find-second-smallest”算法(首先对其进行排序,然后获取第二个元素;引入两个指针等),但如果您坚持遵循接近您的方式,这将按预期工作:

public class Main {
    public static void main(String[] args) {
        int[] arr = {10, 12, 5, 9, 32, 5, 123, 4, -34, 12, -534, -53, -1, 432, 53};
        int res = secondSmallest(arr);
        System.out.println(res);
    }

    public static int secondSmallest(int[] arr) {
        int smallest = arr[0];
        int secsmallest = arr[1];
        int i = 2;
        while (i < arr.length-1) {
            int current = arr[i];
            if (current < smallest) {
                 secsmallest = smallest;
                 smallest = current;
            }
            else if(current < secsmallest) {
                secsmallest = current;
            }
            i++;
        }
        return secsmallest;
    }
}

输出:

-53

推荐阅读