我有一个伪代码:
Input: Array A with n (= length) >= 2
Output: x
x = 0;
for i = 1 to n do
for j = i+1 to n do
if x < |A[i] - A[j]| then
x = |A[i] - A[j]|;
end if
end for
end for
return x;
我已将其转换为真实代码,以便更好地了解它的作用:
public class Test
{
public static void main (String[] args)
{
int A[] = {1,2,3,4,5,6,7,8,9};
int x = 0;
for (int i = 1; i < A.length; i++)
{
for (int j = i + 1; j < A.length; j++)
{
if (x < Math.abs(A[i] - A[j]))
{
x = Math.abs(A[i] - A[j]);
}
}
}
System.out.println(x);
}
}
代码中的数组输出为7。 我使用了另一个数组(1到20),putput是18。 阵列1-30,输出为28。 模式似乎很清楚,算法为您提供了倒数第二个/最后一个数组值的第三个。或者我错了吗?
答案 0 :(得分:5)
我认为伪代码试图找到数组中任何2个元素之间的差异。
但是,您的真实代码从1
而不是0
开始,因此排除了此数组中的第一个元素。
答案 1 :(得分:4)
我认为伪代码试图找到数组中两个数字之间的最大差异。它应该是数组的最小值和最大值之间的差异。
我个人认为这是一个非常差的算法,因为它在O(n ^ 2)中执行此任务。您可以在O(n)中找到数组的最小值和最大值。并取这些数字之间的差异,结果将是相同的。检查伪代码
Input: Array A with n (= length) >= 2
min=A[0];max = A[0];
for i = 1 to n do
if min > A[i] then
min = A[i];
end if
if max < A[i] then
max = A[i]
end if
end for
return (max-min);
答案 2 :(得分:2)
代码给出了数组中任何两个元素之间的最大差异。
有两个嵌套循环,每个循环遍历数组的每个元素。第二个循环从第一个循环元素之后的元素开始,因此每个可能的对只被考虑一次。
变量x
是当前最大值,初始化为0
。如果x
小于当前对的差值的绝对值,那么我们有一个新的最大值并存储它。
但是,因为您直接复制了伪代码的1
起始索引,所以无意中跳过了数组的第一个元素,索引为0
。因此,您的Java代码在不考虑第一个元素的情况下为您提供了最大的差异。
如果您有1
和n
之间的值数组,则跳过1
(在索引0
中),返回的值为{{1} },恰好是数组中倒数第三的值。如果您将数组中的值作为不同的测试用例进行了混洗,那么您会看到返回的值已更改为n - 2
,因为现在将考虑n - 1
和1
(只要n
本身不在第一个位置)。
在任何情况下,您都需要将第一个元素的索引设置为n
,以便考虑第一个元素。然后0
会产生{1,2,3,4,5,6,7,8,9}
(或这些相同元素的任何其他顺序)。
答案 3 :(得分:0)
假设所有正整数,算法简而言之找到数组中最大值和最小值之间的差异。但是,除非在for循环中将i初始化为0,否则它将无法正常工作。
for (int i = 0; i < A.length; i++)