我无法弄清楚如何确切地找到阵列中的最大数量和最小数量。
编写一个方法范围,该范围接受一个整数的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;
}
非常感谢!
答案 0 :(得分:3)
为什么不使用Collections.min和Collections.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);
答案 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;
}