给定两个整型数组,数组a有n个元素, 数组b有m个元素,1<=m<=n<100,请检验数组b是否是数组a的子数组。若从数组a的某个元素a[i]开始,有b[0]=a[i],b[1]=a[i+1],......,b[m]=a[i+m],则称数组b是数组a的子数组。
输入
输入第一行为两个整数n和m;第二行为数组a的n个整数;第三行为数组b的m个整数,各数据之间用空格隔开。
输出
输出占一行。若b是a的子数组,则输出子数组所在位置i,注意下标从0开始;否则输出“No Answer”。
样例输入 Copy
8 3
3 2 6 7 8 3 2 5
3 2 5
样例输出 Copy
5
思路:定义标记变量表示结果是否存在,首先对a数组进行遍历,找出与b[0]相等的数据a[i]后,再使用循环对b后续数字进行比对,如果后续数字出现不同,则break,继续对后续a[i]进行比对,直到对a的遍历结束,最后再看标记变量是否存在,输出相应的答案.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
int[] a = new int[m];
int[] b = new int[n];
boolean flag = false;//标记变量,用于记录答案是否存在
//将数组进行初始化
for (int i = 0; i < m; i++) {
a[i] = sc.nextInt();
}
for (int i = 0; i < n; i++) {
b[i] = sc.nextInt();
}
//定义k变量表示b数组的索引,在进行比较时b再++,如果比较时不符合要求,则重新赋值为0
int k = 0;
//index代表答案索引,当b[0]与a[i]相等时,用index记录i的值
int index = -1;
//首先对a[]进行遍历,让a[i]与b[0]进行比较,如果相等,再进行后面数字比较
for (int i = 0; i < m; i++) {
if (b[k]==a[i]){//相等时
index = i;//记录当前索引(该索引可能是答案也可能不是)
flag = true;//先标记为true,如果后续比对不符,再重新赋值为false
//用循环进行后续数字的比对
for (int i1 = i ; i1 < m ; i1++){
//如果发现后续比对不相等,则标记变量变为false,对k重新赋值为0,直接用break跳出
if (a[i1]!=b[k]){
flag = false;
k = 0;
break;
}
k++;
}
//经过后续比对后如果flag仍为true,直接break跳出,不进行k++操作,否则在最外层循环 会出现越界
if (flag){//即if(true)
break;
}
}
}
//最后看flag的值,true则输出index,false则....
if (flag){
System.out.println(index);
}else {
System.out.println("No Answer");
}
}
}