Java 一组中最小的两个数
我试图在不使用数组的情况下找到集合中的两个最小数字。代码如下:Java 一组中最小的两个数,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.print
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);
Scanner-in=新的扫描仪(System.in);
int N=in.nextInt();
int min=in.nextInt();
对于(int i=1;i
它能找到最小的数,但第二小的数却没有
我该怎么做
请注意,我是Java的完全初学者,非常感谢您的简单解释和帮助)非常简单:
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);
Scanner-in=新的扫描仪(System.in);
int N=in.nextInt();
int min,min2=Integer.MAX\u值,Integer.MAX\u值;
对于(int i=0;i
这是您必须添加的一个条件:
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int min = Integer.MAX_VALUE;
int secondMin = Integer.MAX_VALUE;
for(int i = 0; i < N; i++){
int a = in.nextInt();
if(a < min){
secondMin = min; // the current minimum must be the second smallest
min = a; // allocates the new minimum
}
else if (a < secondMin) {
secondMin = a; // if we did not get a new minimum, it may still be the second smallest number
}
}
System.out.println(min);
System.out.println(secondMin);
Scanner-in=新的扫描仪(System.in);
int N=in.nextInt();
int min=整数最大值;
int secondMin=Integer.MAX\u值;
对于(int i=0;i
一般提示:您应该调用扫描仪的close方法,最好在try with resources
块中调用:
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);
这样,您就可以通过调用poll()
方法的循环来获得给定的n
最小数字。(n
可以是一个数字
解释2:
优先级队列是一种数据结构,它按照自然顺序对给定元素进行内部排序。对于整数,该顺序由
和=
给出。因此,当调用poll()
时,您将删除PriorityQueue
遇到的最小元素。尝试以下操作:
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int min2 = in.nextInt();
int min1 = min2;
for(int i = 1; i < n; i++){
int a = in.nextInt();
if( a < min2){
if(a < min1){
min2 = min1;
min1 = a;
}
else{
min2 = a;
}
}
}
System.out.println(min1 + " " + min2);
Scanner-in=新的扫描仪(System.in);
int n=in.nextInt();
int min2=in.nextInt();
int min1=min2;
对于(int i=1;i
这个问题可以用多种方法解决,选择正确解决方案的第一步是决定什么对你最重要:
空间效率,即使用尽可能少的存储量。ThreeFx这样做,(s)他只为变量N
、a
、min
和secondMin
使用恒定的额外空间。“常量空间”表示存储的数据量不取决于要从流中读取的数字数量。相比之下,Tarlen使用线性空间,存储从流中读取的所有数字。这意味着所需的空间量与N
成正比,而不是常数
时间效率,即执行尽可能少的计算。从这个角度来看,我相信ThreeFx的解决方案是最有效的。Tarlen的解决方案会慢一点,因为管理优先级队列可能需要更多的比较李>
可扩展性,即当需求发生轻微变化时,调整代码的容易程度。假设你的老板让你解决你刚刚发布的问题,找到两个最小的数字。第二天,他想要前三个,以此类推,直到周末。你厌倦了每天修改你的代码,所以你写了一个通用的解决方案,它可以处理他要求的任何数量的元素。这就是塔伦的解决方案更好的地方李>
可读性,即代码的简短易懂程度。我将在这里介绍我自己的解决方案,它基于一个简单的想法:将所有数字放在一个列表中,排序,然后取出前两个数字。请注意,对于资源来说,这是相当浪费的:空间是线性的(我存储的是N
数字),时间效率最多是O(N logn)。这是我的密码:
List List=new ArrayList();
for(inti=0;i
做同样的事情,但同时也要跟踪你所做的事情。这就是问题所在)怎么做@Olicharlessworth有些人已经在修改格式了^^^是的,我也考虑过了,但它并不完美:在集合[5,4,1,2,3]中,第二分钟将是4,因为它是之前的最小值)@JohnyStark是的,我的错,我会马上纠正它!编辑它是正确的,先生@那是你旧代码的一个bug。。。循环从值1
@JohnyStark开始(没问题:我是Java的绝对初学者)所以我不太理解你的代码)你能帮我找到第一种方法吗:同时跟踪第二个最小的数字??如果他甚至不能使用数组,他可能不能使用优先级队列。是的,没错。我忽略了那条线。编辑传入。这并不是说我不能…我不被允许)@JohnyStark请给出一个不允许的例子work@ThreeFx,它不允许我输入最后一个数字。例如,当我输入5,然后尝试输入[5,4,3,2,1]集时,在2之后它将给我t
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int min2 = in.nextInt();
int min1 = min2;
for(int i = 1; i < n; i++){
int a = in.nextInt();
if( a < min2){
if(a < min1){
min2 = min1;
min1 = a;
}
else{
min2 = a;
}
}
}
System.out.println(min1 + " " + min2);