Java Range找到最大和最小int之间的差异

时间:2013-09-24 21:20:48

标签: java

我无法弄清楚如何确切地找到阵列中的最大数量和最小数量。

编写一个方法范围,该范围接受一个整数的ArrayList作为参数,并返回列表中包含的值的范围,该范围定义为比最大和最小元素之间的差值大1。例如,如果名为list的变量存储以下值:

[18,14,29,12,7,25]

范围(列表)的调用应返回23,因为这比任何值对之间的最大差异(29 - 7 + 1 = 23)多一个。空列表定义为范围为0。

到目前为止,我有这个:

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;
}

非常感谢!

7 个答案:

答案 0 :(得分:3)

为什么不使用Collections.minCollections.max

int difference = Collections.max(list) - Collections.min(list);

答案 1 :(得分:3)

你有多种方法可以达到这个目标。

使用集合(更紧凑但更昂贵,因为它在列表上迭代两次,一个找到最大值,一个找到最小值):

public static int range(final ArrayList<Integer> list) {
    if (list.isEmpty()) {
        return 0;
    } else {
        return (Collections.max(list) - Collections.min(list)) + 1;
    }
}

或者像这样使用你自己的算法(更多代码,但只用一个循环找到min和max):

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;
    }
}

答案 2 :(得分:2)

您永远不会计算循环中的最大值和最小值。

提示:在此循环中,找到最大值和最小值。然后计算范围并将其返回。

int min = 0;
int max = 0;
for (int i: list){
 //find max and min here
}
return max - min + 1;

答案 3 :(得分:1)

此任务只需要两行:

Collections.sort(list);
return list.isEmpty() ? 0 : list.get(list.size() - 1) - list.get(0);
  • 使用java JDK的API为您做繁重的工作
  • 这是你如何看待一个重要的问题
  • 更少的代码是好的(只要它清晰易读

答案 4 :(得分:0)

您可以对其进行排序,然后查看第一个和最后一个项目。

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;

答案 5 :(得分:0)

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;
}

答案 6 :(得分:0)

我有另一个有效的解决方案。让我解释一下它是如何工作的。

第一个 if 语句检查空列表情况。

之后,我声明了一个整数变量 int diff 以在最后返回。两个 for 循环选择两个数字,其中第一个从索引 0 开始,而嵌套循环从索引 1 开始,因此循环时不会考虑相同的数字。使用声明为 int calc 的公式获得两个数字之间的差值。由于我们正在寻找两个数字之间的最大差异,因此我们设置了 diff = calc 并保持更新。

最后,我们返回 diff + 1 作为问题所述。

public int range(ArrayList<Integer> list) {
    if (list.size() == 0) {
        return 0;
    }
    int diff = 0;
    for (int i = 0; i < list.size(); i++) {
        for (int j = 1; j < list.size(); j++) {
            int calc = Math.abs(list.get(i) - list.get(j));
            if (diff < calc) {
                diff = calc;
            }
        }
    }
    return diff + 1;
}