本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。
给定一个由若干证书组成的数组nums,请检查数组是否是由某个子数组重复循环拼接而成,请输出这个最小的子数组。
第一行输入数组中的元素个数n,1 <= n <= 100000
第二行输入数组的数字序列nums,以空格分割,0 <= nums[i] <= 10
输出最小的子数组的数字序列,以空格分割;
数组本身是其最大的子数组,循环1次可生成自身;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 输入数组中的元素个数n
int n = Integer.parseInt(sc.nextLine());
// 输入数组的数字序列nums,以空格分割
int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int[] arr = new int[n];
int a = 1;
int b = 0;
while (a < n) {
if (nums[a] == nums[b]) {
arr[a] = b + 1;
a++;
b++;
} else {
if (b > 0) {
b = arr[b - 1];
} else {
a++;
}
}
}
// 最长相同前后缀长度
int c = arr[n - 1];
// 最小重复子串的长度
int length = n % (n - c) == 0 ? n - c : n;
for (int i = 0; i < length; i++) {
System.out.print(nums[i]);
if (i != length - 1) {
System.out.print(" ");
}
}
}
12
1 2 3 4 1 2 3 4 1 2 3 4
1 2 3 4
下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
本文收录于,华为OD机试(JAVA)(2022&2023)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。