出于某种原因,这段代码抛出了一个异常"Index 20 out of bounds for length 20"。我试着使用不同的System.out.println来尝试和调试这些代码,一旦到了最后一个周期,我就知道它超出了界限。我对java非常陌生。我试图理解这种语言,我无法理解我在这里做错了什么。“
这个问题的要点是使用这个数组序列返回一个字符串,它用一个子序列的第一个和最后一个替换连续的数字(例如,在下面的例子中,7,8,9,10,11将是7-11)。
用于调试的数组如下:
int[] {-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20}.它应该返回string= "-6,-3-1,3-5,7-11,14,15,17-20"。
if(arr[i]+1==arr[i+1]){
while(arr[i+j]+1==arr[i+j+1]){
end=arr[i+j+1];
j++;
System.out.println("j="+j);
}我已经尝试过在这一行代码和i=16之前打印,这意味着一旦它完成这个迭代,j=3 i将最终19岁并完成循环。(因为第27行"i+=j;“应该将i设置为19)。
希望我尽可能清楚地解释了这个问题,下面是我编写的代码。
class Solution {
public static String rangeExtraction(int[] arr) {
String res="";
//int start=0;
int end=0;
int j=0;
for(int i=0;i<arr.length;i++){
System.out.println("i="+i);
if(arr[i]+1==arr[i+1]){
while(arr[i+j]+1==arr[i+j+1]){
end=arr[i+j+1];
j++;
System.out.println("j="+j);
}
if(j!=1){ res+=arr[i]+"-"+end+","; }
else{res+=arr[i]+","+end+",";}
i+=j;
j=0;
}else{
res+=arr[i]+",";
}
}
return res.substring(0,res.length()-1);
}
}发布于 2021-06-02 15:37:49
您的指针指向数组长度之外的索引,您将其初始化为int arr。When you are move one index ahead like i+1 you need to run the loop n-1 time or length-1 time在if条件下也有i+j,为了克服这一点,您可以使用mod "%" operator,它将在数组长度内夹紧索引。当我在main函数中运行这个程序时,您可以取消对返回语句的注释。
int arr[] = {-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20};
String res="";
//int start=0;
int end=0;
int j=0;
for(int i=0;i<arr.length - 1;i++){
System.out.println("i="+i);
if(arr[i]+1==arr[i+1]){
while(arr[(i+j) % arr.length]+1==arr[(i+j+1) % arr.length]){
end=arr[i+j+1];
j++;
System.out.println("j="+j);
}
if(j!=1){ res+=arr[i]+"-"+end+","; }
else{res+=arr[i]+","+end+",";}
i+=j;
j=0;
}else{
res+=arr[i]+",";
}
}
//return res.substring(0,res.length()-1);
}https://stackoverflow.com/questions/67808096
复制相似问题