【华为OD机试】最小循环子数组 (C++ Python Java)2023 B卷

题目描述

给定一个由若干整数组成的数组nums,请检查数组是否是由某个子数组重复循环拼接而成,

请输出这个最小的子数组。

输入描述

第一行输入数组中元素个数n,1 ≤ n ≤ 100000

第二行输入数组的数字序列nums,以空格分割,0 ≤ nums[i] < 10

输出描述

输出最小的子数组的数字序列,以空格分割;

备注

数组本身是其最大的子数组,循环1次可生成的自身;

用例1

输入

9

1 2 1 1 2 1 1 2 1

输出

1 2 1

说明

数组[1,2,1,1,2,1,1,2,1] 可由子数组[1,2,1]重复循环3次拼接而成

用例2

输入

15

1 2 1 1 3 1 2 1 1 3 1 2 1 1 3

输出

1 2 1 1 3

题目解析

1.通过递增子串的长度,去比较是否为循环子串,符合条件时退出

考点

KMP算法

代码

n=int(input())
vec=list(map(int,input().split()))
ans=0
for j in range(1,n+1):
    for i in range(n):
        if vec[i]!=vec[i%j]:
            break
        if i==n-1:
            ans=j
            break
    if ans!=0:
        break
for i in range(ans):
    print("{} ".format(vec[i]),end="")

 

你可能感兴趣的:(华为od机试2023B卷,算法,数据结构,华为od,c++,python)