华为OD机试真题 Java 实现【最小循环子数组】【2023 B卷 100分】,附详细解题思路

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、备注
    • 五、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 实现【最小循环子数组】【2023 B卷 100分】,附详细解题思路_第1张图片


下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

本文收录于,华为OD机试(JAVA)(2022&2023)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,java,python,mysql,docker,数据库)