查找一组数字的第二个最小值和第二个最大值。解决方案必须是在输入的单次传递中找到这些值。输入集可能为空或可能非常大:大小不是先验已知的。
你们可以帮助我使用流程图和伪代码吗?谢谢你的进步
我目前的流程图如下所示:
答案 0 :(得分:0)
如果您想在一次通过中获得它,那么按排序顺序输入将很容易。如果它按排序顺序,您可以找到大小,然后使用位置[1]和[n-1]来查找您的数字。
注意:索引从0开始
此外,如果您使用的地图或某些格式不允许重复值,则可以直接获取值。无需重复检查。通过这种方式,您可以一次性解决它。
答案 1 :(得分:0)
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]);
}
}
答案 2 :(得分:0)
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];
}
}
答案 3 :(得分:0)
我认为其他答案都没有提到;如果您需要“一次性完成”,那么首先调用排序算法将意味着不止一次通过数据。将数据放入有序集合等同样
这不是一个完整的答案,而是一个广泛的暗示......
要解决这个问题,请考虑如何解决一个更简单的问题:考虑如何在一次通过中找到最大值 - 从列表中的第一个值开始,然后在列表中查看一个值一段时间 - 每当您看到一个比当前值更大的值时,您将丢弃之前的最大值并保存新的最大值。当您浏览列表时,您还可以与最小值进行比较,并使用新的较小值替换当前最小值。当你到达列表的末尾时,你会在一次通过中找到最大和最小的。
现在想想如何扩展这个逻辑以找到第二大项目:每次查看新数字时,你会测试什么?它比你最大的数字还大吗?它比你的第二大吗?等
更新:你必须为一个包含少于两个项目的列表做一些特殊情况逻辑:这个问题对于长度为&lt;的列表没有意义。 2,所以由你决定如何处理这些输入。 (即你老师想看到什么?)