我想知道当我的输出如下时我的逻辑出了什么问题:
有两个整数数组,它打印第二个列表中第一个列表第一次出现的索引。例如,假设您有这些数组:
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)
应返回8,因为list1
中存储的值序列从索引8开始显示在list2
中。list1
在{{1}中出现两次从位置8开始并从位置12开始。该方法应该返回第一个这样的位置。
目前,我的代码不会打印任何内容......
list2
答案 0 :(得分:3)
arr1[j] != arr2[i]
应为arr1[j] != arr2[i + j]
<强>为什么强>
在内循环的每次迭代中,您应该将原始子序列(arr1[j]
)的每个元素与您从arr2
切换的当前子序列中的相应元素进行比较(arr2[i + j]
)。您只是比较当前切片中的第一个元素。
<强>此外强>
如果i + (arr1.length - 1) < arr2.length
中的最后一个元素为1(或通常等于arr2
中的第一个元素),则循环终止条件应为arr1
,以避免访问超出绑定索引。
<强> ...也强>
第二个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.
}
}
}
答案 1 :(得分:0)
这有效(我添加了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;
}
}
}
}