科大讯飞笔试题
处理一个数组时,机器会存储数组的一些连续子数组。不过为了节省存储空间,当机器遇到多个完全相同的连续子数组时只会存储一次。
现在有一个棘手的问题,给定了两个长度为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 编写的程序,用于计算给定的两个数组中的连续子数组排列种类数量。程序的主要逻辑如下:
- 从标准输入中读取一个整数 n,表示数组的长度。
- 根据长度创建三个数组:nums1、nums2 和 index。
- 循环读取 n 个整数,并将其分别存入 nums1 数组中,同时在 index 数组中记录每个元素的索引位置。
- 循环读取剩余的 n 个整数,并将其存入 nums2 数组中。
- 使用循环遍历 nums2 数组,同时使用变量 i 控制遍历的位置。
- 在第一个 while 循环中,记录当前遍历的位置 i,并获取当前遍历位置对应的 nums2 数组的值。
- 在 index 数组中查找该值对应的索引位置 idx。
- 在第二个 while 循环中,比较 nums2 和 nums1 数组中对应索引位置的值,如果相等,则继续向后遍历。
- 计算当前连续子数组的长度,即 i - temp + 1,使用排列组合公式计算排列种类数量,并将其累加到结果 res 中。
- 将最终计算得到的结果输出到标准输出。
需要注意的是,该程序使用的是简化的排列组合计算公式,只考虑了连续子数组的长度,并未考虑元素的实际取值组合。如果要考虑元素的实际取值组合,需要使用其他的计算方法。
另外,该程序中使用了 Scanner 类来读取输入,请确保在运行该程序时提供合适的输入。