华为OD机考2025B卷 - 最小循环子数组(Java & Python& JS & C++ & C )

最新华为OD机试

真题目录:点击查看目录
华为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,1,1,2,1,1,2,1],最小的循环子数组是 [1,2,1],它重复3次可以生成原数组。

算法原理

这个问题可以使用 KMP 算法的思想来解决。KMP 算法主要用于字符串匹配,但其中的"前缀函数"(next数组)可以帮助我们找到循环模式。

KMP 的 next 数组在这里的应用

  1. next数组记录了每个位置的最长相等前后缀长度
  2. 对于数组末尾位置 i,next[i] 表示数组的前 next[i] 个元素与末尾的 next[i] 个元素相同
  3. 如果数组是由某个子数组循环构成的,那么 (数组长度 - next[末尾位置]) 就是可能的循环子数组的长度

关键思路

如果一个数组是循环构成的,假设循环子数组长度为 k,数组长度为 n,则有:

  • n 必须是 k 的整数倍
  • 如果 (n % (n - next[n-1]) == 0),说明数组可以被分成整数个循环子数组
  • 此时最小循环子数组长度为 (n - next[n-1])
  • 否则,无法找到真正的循环子数组,整个数组本身就是最小的"循环子数组"(循环1次)

示例分析

对于输入 [1,2,1,1,2,1,1,2,1]

  1. 构建 next 数组:[0,0,1,1,2,3,4,5,6]
  2. 最后一个元素的 next 值是 6
  3. 计算:9 % (9 - 6) = 9 % 3 = 0,可以整除
  4. 因此最小循环子数组长度为 3
  5. 输出前 3 个元素:[1,2,1]

Java

import java
### 华为OD机考2025B题库及相关资料 华为OD机考2025B的题库和相关资料可以通过以下方式获取或了解。以下是关于2025B的具体内容、备考建议以及相关信息。 #### 1. 题库来源与获取方式 华为OD机考2025B的题库通常由官方提供,但具体题目不会完全公开。考生可以通过以下途径获取相关资料: - **官方在线OJ环境**:华为提供了专门的在线OJ环境用于刷题[^2]。通过私信联系开通OJ环境,可以模拟真实考试场景并练习类似题目。 - **第三方平台**:例如牛客网等平台会整理历年真题及高频考点,供考生参考[^4]。 - **内部分享**:部分参加过考试的考生会在社区中分享经验与题目类型,这些资源可以帮助理解考试模式[^1]。 #### 2. 考试内容概述 2025B主要考察以下几个方面: - **算法设计与实现**:涉及基础数据结构(如数组、链表、栈、队列)和常见算法(如排序、查找、动态规划)[^1]。 - **编程语言基础**:支持多种编程语言(C++JavaPythonJavaScript等),考生需熟悉所选语言的基本语法与标准库[^4]。 - **实际问题解决能力**:题目通常以实际应用场景为背景,例如数据分类、路径规划等问题[^3]。 #### 3. 备考建议 为了更好地准备2025B,以下是一些具体的备考建议: - **熟悉输入输出方式**:不同语言有各自的输入输出规范。例如,Python使用`input()`和`print()`,C++使用`cin`和`cout`。 - **掌握常见算法模板**:包括但不限于快速排序、二分查找、深度优先搜索(DFS)、广度优先搜索(BFS)等。 - **模拟真实考试环境**:利用在线OJ平台进行模拟练习,确保在规定时间内完成题目[^2]。 #### 4. 示例代码 以下是一个简单的示例代码,展示如何处理输入输出并解决问题: ```python # 数据分类问题示例 def data_classification(data, threshold): result = [] for item in data: if item &gt; threshold: result.append(item) return result # 输入处理 if __name__ == &quot;__main__&quot;: n = int(input()) # 数据数量 data = list(map(int, input().split())) # 数据列表 threshold = int(input()) # 阈值 output = data_classification(data, threshold) print(len(output)) # 输出符合条件的数据数量 ``` 此代码展示了如何读取输入数据并根据条件筛选结果[^4]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值