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 开始。 list1list2 中出现两次,从位置 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;
            }
        }
    }
}