我已经调试了这段代码,即使满足终止条件,它也似乎正在运行for循环。
该程序接受两种输入:
第1行-(N)之后有多少个数据点
第2到N行-数据点
然后程序应打印所有数据点之间的最小差异。
例如,一个示例输入将是(在单独的行上):3 5 8 9
有3个数据点(5 8 9),并且最小的差在8和9之间,因此程序应返回1。
我正在尝试以进行比较的同时将数据点填充到数组中的方式构建程序。显然,我可以将这些问题分开,但是我正在尝试。在这里:
package com.m3c.vks.test;
import java.util.*;
import java.io.*;
import java.math.*;
class Solution {
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
int N = in.nextInt(); //How many data points there will be
int strengthArray[] = new int[N]; //Initialise the array to be of length = N, the first input line
int tempStrengthDifference=99999; //junk difference set arbitrarily high - bad practice I know
int lowestStrengthDifference=99999;
for (int i = 0; i < N; i++) //Go through all elements of array
{
strengthArray[i] = in.nextInt(); //read a value for the ith element
System.out.println("i: " + i); //test
if (i > 0) //do not execute the next for loop if i = 0 as cannot evaluate sA[-1]
{
for (int j = i - 1; j < 1; j--) // **this is line 20** from wherever the array has populated up to, work backwards to compare the numbers which have been fed in thus far
{
System.out.println("j: " + j); //test
tempStrengthDifference = Math.abs(strengthArray[i] - strengthArray[j]); //finding the difference between two values
if (tempStrengthDifference < lowestStrengthDifference) //store the lowest found thus far in lowestSD
{
lowestStrengthDifference = tempStrengthDifference;
}
}
}
}
System.out.println(lowestStrengthDifference);
}
}
一切都很好,直到第20行的i = 1为止。此时,将j设置为i-1 = 0并找到差值。但是,当for循环再次返回时,不满足j <1的终止条件,而是循环继续设置j = -1,这时它抛出了超出范围的错误,因为它显然无法评估strengthArray [-1]
有什么想法吗?谢谢
答案 0 :(得分:1)
看看你的循环:for (int j = i - 1; j < 1; j--)
您在j = 0
时从i == 1
开始,因此j < 1
没问题。
下一个迭代具有j = -1
(0-1
),因此您会遇到问题。
您是要使用j >= 0
作为循环条件吗?请注意,第二个参数不是终止条件,而是延续条件,即只要满足该条件,循环就会执行。
答案 1 :(得分:0)
失败的原因是内部循环变量更改。 当i = 1时,j = 0,并且执行一次循环后,J递减,因此j变为-1。由于您已经写了j--,所以满足j <1的条件,将其更改为j ++,就可以了。 。