当前位置: 首页 > news >正文

最小循环子数组 - 华为OD统一考试(Python题解)

华为OD机试题库《C++》限时优惠 9.9

华为OD机试题库《Python》限时优惠 9.9

华为OD机试题库《JavaScript》限时优惠 9.9

针对刷题难,效率慢,我们提供一对一算法辅导, 针对个人情况定制化的提高计划(全称1V1效率更高)。

看不懂有疑问需要答疑辅导欢迎私VX: code5bug

华为OD机试真题

题目描述

给定一个由若干整数组成的数组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次拼接而成

题解

这道题目属于数组模式匹配类问题,具体来说是寻找数组的最小循环节(最小重复子数组)。这类问题通常可以通过字符串匹配算法或数学方法解决。

解题思路

核心思路

  1. 问题转化:将原问题转化为寻找数组的最小周期(最小重复子数组长度)。如果数组可以由某个子数组重复多次构成,那么这个子数组的长度必须是数组长度的约数。
  2. 关键观察
    • 最小重复子数组的长度必须是数组长度的约数
    • 每个元素出现的次数必须是重复次数的整数倍
    • 需要验证候选子数组是否能通过重复构成原数组
  3. 优化策略
    • 先统计每个数字的出现频率
    • 最小重复次数是所有数字出现次数的最大公约数
    • 从小到大枚举可能的子数组长度进行验证

算法选择

使用枚举+验证的方法:

  1. 枚举所有可能的子数组长度(数组长度的约数)
  2. 对于每个候选长度,验证是否能通过重复构成原数组

Python

from collections import Counterdef check_repeated(nums, sub_length):"""检查数组nums是否由长度为sub_length的子数组重复构成"""n = len(nums)return all(nums[i] == nums[j] for i in range(sub_length) for j in range(i + sub_length, n, sub_length))def main():n = int(input())nums = list(map(int, input().split()))cnt = Counter(nums)result = n  # 默认结果是整个数组# 枚举所有可能的子数组长度for sub_length in range(1, n // min(cnt.values()) + 1):if n % sub_length != 0:continueif any(v % sub_length for v in cnt.values()):continueif check_repeated(nums, sub_length):result = sub_lengthbreak# 输出结果子数组print(' '.join(map(str, nums[:result])))if __name__ == "__main__":main()

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

相关文章:

  • 【Java项目脚手架系列】第五篇:Spring Boot + MyBatis项目脚手架
  • 解锁HBase:大数据存储的神秘之门
  • 使用fdisk 、gdisk管理分区
  • C++中的继承与多态
  • 智能指针:C++内存管理的现代解决方案
  • clangd与clang-tidy
  • Ansible模块——对被控主机检查是否可达和执行Shell命令
  • 电池的寿命(不清楚是什么类型/虽然有标明是贪心)
  • DAX 权威指南1:DAX计算、表函数与计算上下文
  • JS DOM操作与事件处理从入门到实践
  • Flink和Spark的选型
  • 【vue】vuex实现组件间数据共享 vuex模块化编码 网络请求
  • 使用 Jackson 在 Java 中解析和生成 JSON
  • C.printf 函数基础
  • 大模型的RAG技术系列(三)
  • linux和linux 、linux和windows实现文件复制笔记
  • 基于ssm+mysql的快递管理系统(含LW+PPT+源码+系统演示视频+安装说明)
  • C语言复习--柔性数组
  • Vite Proxy配置详解:从入门到实战应用
  • Activity动态切换Fragment
  • 湖北宜昌:在青山绿水间解锁乡村振兴“密码”
  • 2025世界数字教育大会将于5月14日至16日在武汉举办
  • 戴维·珀杜宣誓就任美国驻华大使
  • 8小时《大师与玛格丽特》:长度可以是特点,但不是价值标准
  • 碧桂园服务:拟向杨惠妍全资持有的公司提供10亿元贷款,借款将转借给碧桂园用作保交楼
  • 央行:5月8日起,下调个人住房公积金贷款利率0.25个百分点