【发布时间】:2012-09-04 07:07:12
【问题描述】:
我正在尝试创建一个返回 int 的方法 - 已发送数组中最大整数的值。
我希望这种方法起作用的方式是在 for 循环中检查数组的第一个 和 最后一个元素,然后按照它们的方式工作到中间。所以 i = 第一个整数,k = 最后一个整数。当i = 0, k = n-1(索引),当i = 1, k = n-2,如果你发现我的想法。在每个循环中,它都需要检查if a[i]>a[k]。然后他们交换位置。然后我知道最大的数字在数组的前半部分,然后我想让它检查那一半,所以最终最大的 int 在索引 0 处。
我试过这样:
public static int maxOfArray(int[] a)
{
int length = a.length;
if(length<1)
throw new NoSuchElementException("Not at least one integer in array");
while (length > 1)
{
int k = length;
for(int i = 0; i < length/2; i++)
{
k--;
if(a[i]<a[k])
{
int j = a[i];
a[i] = a[k];
a[k] = j;
}
}
length /=2;
}
return a[0];
}
..但我真的不明白..我很难“想象”这里发生了什么..但它并不总是有效..(尽管有时)。
编辑 另外:数组{6,15,2,5,8,14,10,16,11,17,13,7,1,18,3,4,9,12};将吐出 17 作为最大的数字。我意识到我必须修复奇数长度的错误,但我想先解决这个偶数长度的数组..
【问题讨论】:
-
您能否详细说明您为什么要尝试线性扫描这种复杂方法的原因?是硬件吗?书中的例子?面试?它可能会帮助我们为您提供更有针对性的答案。
-
"[...] 然后他们交换位置" - 看起来 OP 实际上想要以某种冒泡排序样式对数组进行 排序。请添加 quiz 标签!
-
@amit 嗯,是的。这是一个小学校项目。我可以用其他方法看到很多答案,但要求是比较第一个和最后一个,如果最后一个更大,则切换位置 - 然后继续朝向数组的中间。最大的不是放在索引0,而是放在数组的“左边”,这样到时候就放在索引0了..
-
最大的并不总是在前半部分。假设您的数组是 [1, 5, 3],那么您首先比较 (1 > 3),然后比较 (5 > 5),最后比较 (3 > 1)。您现在有 [3, 5, 1] 并将长度除以 2 得到数组 [3]。您丢失了 5。此外,如果您切换比较,则不必扫描整个数组,只需扫描一半。现在您首先将大数移到上半部分,然后再移回下半部分。
-
所以
for(int i = 0; i < length; i++)是错误的,你只需要遍历数组的前半部分:for(int i = 0; i < length / 2; i++)。还要检查如果数组大小是奇数会发生什么。
标签: java arrays algorithm integer