目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、备注
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。
- 专栏福利:限时订阅49.9,订阅后可加入华为OD刷题群,获得哪吒优先答疑机会(华为OD刷题指导,远程代码调试),群里大佬众多可以抱团取暖,群友刷题经验分享,考试经验分享。
一、题目描述
给定一个由若干证书组成的数组nums,请检查数组是否是由某个子数组重复循环拼接而成,请输出这个最小的子数组。
二、输入描述
第一行输入数组中的元素个数n,1 <= n <= 100000
第二行输入数组的数字序列nums,以空格分割,0 <= nums[i] <= 10
三、输出描述
输出最小的子数组的数字序列,以空格分割;
四、备注
数组本身是其最大的子数组,循环1次可生成自身;
五、Java算法源码
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(" ");
}
}
}
六、效果展示
1、输入
12
1 2 3 4 1 2 3 4 1 2 3 4
2、输出
1 2 3 4
🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。