Java-zzuli1147查找子数组(带思路)

给定两个整型数组,需要检验数组b是否是数组a的子数组。程序通过遍历数组a,查找与b[0]匹配的元素,然后对比后续元素来判断b是否连续存在于a中。如果找到符合条件的子数组,输出其起始位置;否则输出NoAnswer。
摘要由CSDN通过智能技术生成

给定两个整型数组,数组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");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贰叁肆775

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值