java - 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);
}
}
}
解决方案
首先:
我的逻辑是有序的,但由于某种原因它无法正确执行。
意味着您的逻辑不正常(除非只是拼写错误或其他语法错误,从而阻止了完美的结果);
第二:
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
推荐阅读
- sql - Oracle 选择索引优化
- apache-spark - 本地模式下的 Apache Spark 结构化流字数统计示例超慢
- javascript - yii2 Fullcalendar - 为什么警告 CalEvent 工作但不更新 innerHtml?
- git - Git守护程序克隆边带解复用器中的致命错误并读取错误无效参数
- javascript - 使用 useCallback/useMemo 冻结闭包
- angular - 在 Angular 2+ 中,我如何在兄弟组件之间进行通信
- android - 当 Fragment 滚动结束时,Android ViewModel 会加载更多数据
- flutter - 我可以在 MAC 上使用 Flutter 开发 IOS 移动应用程序,并且也可以在 android 设备上工作吗
- excel - Vba复制范围并粘贴为高质量图片
- javascript - Javascript 类的范围是如何工作的?