这是CodingBat.com“ frontPiece”上的问题。如对问题的解释所示,返回值应该是原始数组的前两个元素组成的数组。那没问题。但是,有一些边缘情况是一个空数组和一个元素的数组。这是我遇到一些错误的地方。
执行此操作的简单方法是为每种边缘情况使用IF语句。这对我来说似乎很容易,而我做这些练习的原因之一就是学习新工具,例如增强的FOR循环。
if(nums.length < 2){
int[] answer = new int[nums.length];
for(int x: nums){
answer[x] = nums[x];
}
return answer;
}else{
int[] answer = new int[2];
answer[0] = nums[0];
answer[1] = nums[1];
return answer;
}
} ```
大多数输入数组将使IF语句失败,从而陷入代码的ELSE部分中新数组的声明和填充。空数组会导致创建并返回一个空数组,同时也会传递。该错误带有一个大小为1的数组。
我对增强的FOR或FOR EACH循环的理解(可能不够充分)是,它逐步执行数组,并为其中的每个元素执行下面的代码块。我本以为将ANSWER数组的长度设置为原始NUMS数组的长度会避免OOB错误。
感谢您的帮助。预先感谢。
答案 0 :(得分:0)
在此循环中
lib
您没有遍历for(int x: nums)
数组的 indexes ,而是遍历了 values ,因此,如果值大于nums
,您将无法使用数组边界
例如:
nums.length
在for-each循环的第一次迭代中,int nums[] = new int[]{1000};
是nums.length
,您将尝试访问1
和answer[1000]
对于这种复制,您应该使用nums[1000]
版的循环或更好的for(;;)
方法