0

我无法弄清楚如何让它找到数组中的最大数量和最小数量。

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

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

range(list) 的调用应该返回 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;
}

非常感谢!

4

7 回答 7

3

你有更多的方法来实现这个目标。

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

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;
    }
}
于 2013-09-24T21:30:06.017 回答
3

为什么不使用Collections.minCollections.max

int difference = Collections.max(list) - Collections.min(list);
于 2013-09-24T21:26:46.313 回答
2

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

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

int min = 0;
int max = 0;
for (int i: list){
 //find max and min here
}
return max - min + 1;
于 2013-09-24T21:23:32.097 回答
1

这个任务只需要两行:

Collections.sort(list);
return list.isEmpty() ? 0 : list.get(list.size() - 1) - list.get(0);
  • 使用 java JDK 的 API 为您完成繁重的工作
  • 重要的是你如何看待问题
  • 代码越少越好(只要它清晰易读
于 2013-09-24T21:25:59.217 回答
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;
于 2013-09-24T21:35:57.110 回答
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;
}
于 2013-09-24T21:51:09.903 回答
0

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

第一个 if 语句检查空列表案例。

之后,我声明了一个整数变量int diff以在最后返回。两个 for 循环选择两个数字,其中第一个从 index 开始,0而嵌套循环从 index 开始,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;
}
于 2021-07-16T12:05:24.293 回答