华为算法题:寻找最远相同数字积木距离-Java实现

5星 · 超过95%的资源 需积分: 5 1 下载量 125 浏览量 更新于2024-08-04 收藏 1KB MD 举报
本题是华为OD算法100分题,涉及一个有趣的积木游戏背景下的编程挑战。题目描述中,小华和小薇在学习过程中通过积木游戏来练习数学,积木上标有数字。玩家小华随机排列这些积木,小薇的任务是找出数字相同的积木中,位置最远的两块积木,并计算它们之间的距离。如果所有积木上的数字都不相同,则返回-1。 输入部分,首先读取一个整数N,表示积木的总数,然后接下来N行每个数字分别代表积木上的数字,范围限制在0到\(10^9\)之间,且积木数量不超过1000个。 输出则是两个数字相同的积木块之间的最远距离,如果找不到这样的积木对,则返回-1。 Java解法的核心思路是使用哈希映射(HashMap)来存储每个出现过的数字及其对应的索引(位置)。遍历过程中,对于每个新遇到的数字,检查它是否已经存在于哈希映射中,若存在则更新答案(最大距离),同时更新该数字在映射中的最近索引。最后输出答案。 下面是对Java代码的详细解释: 1. 首先创建一个`Scanner`对象sc,用于从标准输入读取数据。 2. 使用`nextInt()`方法读取积木的总数N。 3. 初始化一个`HashMap<Integer, Integer>`,即`indexMap`,用于存储每个数字及其出现的第一个位置。 4. 使用一个循环,从0到N-1: - 读取一个积木上的数字x。 - 检查`indexMap`中是否已包含这个数字x,若不包含则将数字x和当前位置i存入映射,并设置初始最大距离ans为i。 - 若已包含数字x,说明找到了一个重复数字,更新最大距离ans为当前位置i与映射中对应位置的差值,取较大者。 5. 循环结束后,`ans`存储了最远的相同数字积木间的距离,将其打印到控制台。 总结来说,这是一个运用数据结构和算法解决问题的实际场景,考察了候选人在处理查找和更新操作时的数据结构优化能力,以及处理边界条件(如所有数字不同)的能力。通过编写Java代码,我们巧妙地利用哈希映射实现了一个高效的解决方案。