Java范围查找最大和最小int之间的差异
我很难准确地找到数组中的最大数和最小数 编写一个方法范围,该范围接受整数数组列表作为参数,并返回列表中包含的值的范围,该范围定义为大于最大和最小元素之差1。例如,如果名为list的变量存储以下值: [18,14,29,12,7,25] rangelist的调用应该返回23,因为这比任何一对值29-7+1=23之间的最大差值多一个。空列表的定义范围为0 到目前为止,我有:Java范围查找最大和最小int之间的差异,java,Java,我很难准确地找到数组中的最大数和最小数 编写一个方法范围,该范围接受整数数组列表作为参数,并返回列表中包含的值的范围,该范围定义为大于最大和最小元素之差1。例如,如果名为list的变量存储以下值: [18,14,29,12,7,25] rangelist的调用应该返回23,因为这比任何一对值29-7+1=23之间的最大差值多一个。空列表的定义范围为0 到目前为止,我有: public static int range(ArrayList<Integer> list) { in
public static int range(ArrayList<Integer> list)
{
int min = 0;
int max = 0;
int range = 0;
for (int i: list)
{
if (list.size() > 0)
{
range = max - min + 1;
}
}
return range;
}
多谢各位 您从不计算循环中的最大值和最小值 提示:在此循环中,找到最大值和最小值。然后计算范围并返回它
int min = 0;
int max = 0;
for (int i: list){
//find max and min here
}
return max - min + 1;
此任务只需要两行:
Collections.sort(list);
return list.isEmpty() ? 0 : list.get(list.size() - 1) - list.get(0);
使用JavaJDK的API为您完成繁重的工作
重要的是你如何看待问题
只要代码清晰易读,代码越少越好
为什么不使用和
你有不止一种方法来实现这个目标 使用更紧凑但更昂贵的集合,因为它在列表上重复两次,一次查找最大值,一次查找最小值:
public static int range(final ArrayList<Integer> list) {
if (list.isEmpty()) {
return 0;
} else {
return (Collections.max(list) - Collections.min(list)) + 1;
}
}
或者使用您自己的算法,如下面的代码,但只使用一个循环查找最小值和最大值:
public static int range(final ArrayList<Integer> list) {
if (list.isEmpty()) {
return 0;
} else {
int max = list.get(0);
int min = list.get(0);
for (final int i : list) {
if (i > max) {
max = i;
} else if (i < min) {
min = i;
}
}
return (max - min) + 1;
}
}
你们可以把它分类,然后看一下拳头和最后一件物品
public static int range(List<Integer> input)
{
if(input == null || input.size() == 0) throw new IllegalArgumentException("");
if(input.size() == 1) return 0;
List<Integer> copy = new ArrayList(input);
Collections.sort(copy);
int min = copy.get(0);
int max = copy.get(copy.lenght-1);
return max - min;
}
这不是一个完美的解决方案,因为列表可能包含空值
你可以从简单的比较开始
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for(Integer integer : input) {
if(i == null) continue;
int i = integer.intValue();
if(i < min) {
min = i;
}
if(i > max) {
max = i;
}
}
return max - min;
提示Math.max和Math.min将帮助您计算循环中的最小值和最大值,并在循环后返回差值。为什么子类?只需返回计算+1,我在更少代码范例中被击败:@mad Now这是作弊!如果列表为空,此代码可能引发NoTouchElementException。在调用max和min方法之前必须检查它。当列表包含负数时,此操作将失败。如果列表为空,则此代码可能引发NosTouchElementException。在调用max和min方法之前必须检查它。@LucaMastrostefano是的-这不是一个完整、安全的解决方案,但由于您提出了这一点,我增加了安全性。仍然只有两行:现在是伟大的!但在我看来,排序是对资源的浪费,最好使用最小值和最大值方法。@LucaMastrostefano性能上的差异可以用微秒甚至纳秒来衡量。实际上,这可能不会比max/min慢多少,因为max/min需要遍历列表的两个s-如果列表排序足够,排序将非常快。您如何知道对象是如何比较的?尝试使用非常昂贵的方法对数百万个对象进行排序。你可能会损失几秒钟。你可以使用Math.min和Math.max代替。不,我不能,因为:Math类型中的方法maxint,int不适用于参数数组。使用更紧凑但更昂贵的集合,因为它在列表上迭代了两次,是吗?是的,是的。添加或删除元素时,ArrayList不会计算列表的最大值或最小值。因此,Collections.max在列表中删除一次,Collections.min在列表中删除另一次。
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for(Integer integer : input) {
if(i == null) continue;
int i = integer.intValue();
if(i < min) {
min = i;
}
if(i > max) {
max = i;
}
}
return max - min;
public static int range(ArrayList<Integer> list){
int min = list.get(0);
int max = list.get(0);
for (int i = 0; i < list.size(); i++){
if (list.get(i) > max)
max = list.get(i);
if ((list.get(i) < min))
min = list.get(i);
}
return max-min+1;
}