计算给定的两个数组中的连续子数组排列种类数量

科大讯飞笔试题

处理一个数组时,机器会存储数组的一些连续子数组。不过为了节省存储空间,当机器遇到多个完全相同的连续子数组时只会存储一次。

现在有一个棘手的问题,给定了两个长度为n的数组,这两个数组均满足以下性质:1 到n恰好出现了一次,请你判断机器存储完所有的连续子数组时,一共存储了多少次。

输入描述

第一行输入一个正整数n,代表数组的长度。

第二行输入n个正整数ai,代表第一个数组。

第三行输入n个正整数bi,代表第二个数组。

1<=n<=2*10^5

输出描述

机器存储的次数。

示例1

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

3
1 2 3
2 3 1
输出

8
说明

[1],[2],[3],[1,2],[2,3],[3,1],[1,2,3],[2,3,1]一共存储了8次。

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        long res = (long) (1 + n) * n;
        int[] nums1 = new int[n];
        int[] nums2 = new int[n];
        int[] index = new int[n + 1];
        for (int i = 0; i < n; i++) {
            nums1[i] = sc.nextInt();
            index[nums1[i]] = i;
        }
        for (int i = 0; i < n; i++) {
            nums2[i] = sc.nextInt();
        }
        int i = 0;
        while(i < n){
            int temp = i;
            int num = nums2[i];
            int idx = index[num];
            while (idx < n && i < n && nums2[i] == nums1[idx]){
                i++;
                idx++;
            }
            res -= (long) (1 + (i - temp)) * (i - temp) / 2;
        }
        System.out.println(res);
    }
}

这是一个使用 Java 编写的程序,用于计算给定的两个数组中的连续子数组排列种类数量。程序的主要逻辑如下:

  1. 从标准输入中读取一个整数 n,表示数组的长度。
  2. 根据长度创建三个数组:nums1、nums2 和 index。
  3. 循环读取 n 个整数,并将其分别存入 nums1 数组中,同时在 index 数组中记录每个元素的索引位置。
  4. 循环读取剩余的 n 个整数,并将其存入 nums2 数组中。
  5. 使用循环遍历 nums2 数组,同时使用变量 i 控制遍历的位置。
  6. 在第一个 while 循环中,记录当前遍历的位置 i,并获取当前遍历位置对应的 nums2 数组的值。
  7. 在 index 数组中查找该值对应的索引位置 idx。
  8. 在第二个 while 循环中,比较 nums2 和 nums1 数组中对应索引位置的值,如果相等,则继续向后遍历。
  9. 计算当前连续子数组的长度,即 i - temp + 1,使用排列组合公式计算排列种类数量,并将其累加到结果 res 中。
  10. 将最终计算得到的结果输出到标准输出。

需要注意的是,该程序使用的是简化的排列组合计算公式,只考虑了连续子数组的长度,并未考虑元素的实际取值组合。如果要考虑元素的实际取值组合,需要使用其他的计算方法。

另外,该程序中使用了 Scanner 类来读取输入,请确保在运行该程序时提供合适的输入。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值