Java嵌套循环逻辑错误
Java nested loop logic error
我想知道当我的输出应该如下时我的逻辑有什么问题:
有两个整数数组,它打印第二个 list.For 示例中第一个列表第一次出现的索引,假设您有这些数组:
int[] list1 = {1, 3, 6};
int[] list2 = {1, 3, 5, 8, 12, 1, 3, 17, 1, 3, 6, 9, 1, 3, 6};
然后调用 indexOf(list1, list2)
应该 return 8 因为存储在 list1
中的值序列出现在 list2
中从索引 8 开始。 list1
在 list2
中出现两次,从位置 8 开始,从位置 12 开始。该方法应该 return 第一个这样的位置。
目前,我的代码没有打印任何东西...
public static void indexOf(int[] arr1, int[] arr2){
for(int i = 0; i < arr2.length; i++){
for(int j = 0; j < arr1.length; j++){
if(arr1[j] != arr2[i]){
break;
}
if(j == arr1.length -1){
System.out.println(i);
break;
}
}
}
}
arr1[j] != arr2[i]
应该是 arr1[j] != arr2[i + j]
为什么
在内循环的每次迭代中,您应该将原始子序列 (arr1[j]
) 的每个元素与您从 arr2
(arr2[i + j]
).您正在与当前切片中的第一个元素进行比较。
此外
如果 arr2
中的最后一个元素为 1(或通常等于 arr1
中的第一个元素),您的循环终止条件应为 i + (arr1.length - 1) < arr2.length
以避免访问越界索引).
...还有
第二个 break
应该是 return
以打印您所说的第一个匹配项。
完整代码
public static void indexOf(int[] arr1, int[] arr2) {
for(int i = 0; i + (arr1.length - 1) < arr2.length; i++) {
for(int j = 0; j < arr1.length; j++) {
if(arr1[j] != arr2[i + j]) {
break;
}
if(j == (arr1.length - 1)){
System.out.println(i);
break; // break to print all the occurrences. return to print only the first.
}
}
}
这有效(我添加了 i+j 而不是 j):
public static void indexOf(int[] arr1, int[] arr2){
for(int i = 0; i < arr2.length; i++){
for(int j = 0; j < arr1.length; j++){
if((i + j) < arr2.length && arr1[j] != arr2[i + j]){
break;
}
if(j == arr1.length -1){
System.out.println(i);
break;
}
}
}
}
我想知道当我的输出应该如下时我的逻辑有什么问题:
有两个整数数组,它打印第二个 list.For 示例中第一个列表第一次出现的索引,假设您有这些数组:
int[] list1 = {1, 3, 6};
int[] list2 = {1, 3, 5, 8, 12, 1, 3, 17, 1, 3, 6, 9, 1, 3, 6};
然后调用 indexOf(list1, list2)
应该 return 8 因为存储在 list1
中的值序列出现在 list2
中从索引 8 开始。 list1
在 list2
中出现两次,从位置 8 开始,从位置 12 开始。该方法应该 return 第一个这样的位置。
目前,我的代码没有打印任何东西...
public static void indexOf(int[] arr1, int[] arr2){
for(int i = 0; i < arr2.length; i++){
for(int j = 0; j < arr1.length; j++){
if(arr1[j] != arr2[i]){
break;
}
if(j == arr1.length -1){
System.out.println(i);
break;
}
}
}
}
arr1[j] != arr2[i]
应该是 arr1[j] != arr2[i + j]
为什么
在内循环的每次迭代中,您应该将原始子序列 (arr1[j]
) 的每个元素与您从 arr2
(arr2[i + j]
).您正在与当前切片中的第一个元素进行比较。
此外
如果 arr2
中的最后一个元素为 1(或通常等于 arr1
中的第一个元素),您的循环终止条件应为 i + (arr1.length - 1) < arr2.length
以避免访问越界索引).
...还有
第二个 break
应该是 return
以打印您所说的第一个匹配项。
完整代码
public static void indexOf(int[] arr1, int[] arr2) {
for(int i = 0; i + (arr1.length - 1) < arr2.length; i++) {
for(int j = 0; j < arr1.length; j++) {
if(arr1[j] != arr2[i + j]) {
break;
}
if(j == (arr1.length - 1)){
System.out.println(i);
break; // break to print all the occurrences. return to print only the first.
}
}
}
这有效(我添加了 i+j 而不是 j):
public static void indexOf(int[] arr1, int[] arr2){
for(int i = 0; i < arr2.length; i++){
for(int j = 0; j < arr1.length; j++){
if((i + j) < arr2.length && arr1[j] != arr2[i + j]){
break;
}
if(j == arr1.length -1){
System.out.println(i);
break;
}
}
}
}