【华为机试真题 Python实现】输出匹配字符串的开始下标

这篇博客介绍了华为机试中的一道题目,要求使用Python实现找出子串在母串中完全匹配的开始下标。文章强调代码不必追求性能最优,并提供了题目描述、注意事项和示例输入输出。此外,还提到在机试中即使运行超时,如果用例通过率高也能获得相应分数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

《华为机试真题》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。

如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议!

本文解法非最优解(即非性能最优)。

题目描述

给出母串和子串,输出子串能够在母串完全匹配的开始位置。

特别提醒!!!!
注意1:机试为ACM 模式
你的代码需要处理输入输出,input接收输入、print格式化输出

注意2:机试按通过率记分
复杂题目可以考虑暴力破解,再逐步优化,不是运行超时就无法得分,如下,提交结果运行超时,但用例通过率>92.31% , 如果是100分的题目,可以得92.3分。
在这里插入图片描述<

通过遍历数组并维护左右两侧元素的乘积,当两侧乘积相等时找到中心位置。文章提供了详细的解题思路和Python代码示例。摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >题目描述给你一个整数数组nums,请计算数组的中心位置。数组的中心位置是数组的一个下标, 其左侧所有元素相乘的积等于右侧所有元素相乘的积。数组第一个元素的左侧积为1,最后一个元素的右侧积为1。 如果数组有多个中心位置,应该返回最靠近左边的那一个,如果数组不存在中心位置,返回-1。输入2 5 3 6 5 6输出3题意解读左侧积:该元素左侧所有元素的乘积;右侧积:该元素右侧所有元素的乘积;例如元素3,他的左侧积是 2*5 = 10. 他的右侧积是6*5*6 = 180数组的中心位置指的是:该元素的 左侧积 等于 右侧积解题思路遍历整个数组,在遍历的过程中,计算当前元素左侧所有元素的乘积(leftProduct )和右侧所有元素乘积(rightProduct ),当leftProduct == rightProduct,表示找到了中心位置。那么,如何初始化左侧积leftProduct 和右侧积 rightProduct 呢?leftProduct 初始值为 1,rightProduct初始值是所有元素相乘。初始化完成后,开始遍历数组,从左到右的顺序遍历 。对于当前位置 i,首先更新左侧积(如果 i 不是第一个元素,那么左侧积为 leftProduct * nums[i-1]),然后更新右侧积(rightProduct / nums[i])。如果左侧积和右侧积相等,则表示i就是中心点。视频讲解2023华为真题【计算数组中心位置】示例代码(Python版本)def find_center_index(nums): if len(nums) == 1: return 0 n = len(nums) left_product = [1] * n right_product = [1] * n for i in range(1, n): left_product[i] = left_product[i - 1] * nums[i - 1] for i in range(n - 2, -1, -1): right_product[i] = right_product[i + 1] * nums[i + 1] for i in range(n): if left_product[i] == right_product[i]: return i return -1nums = [int(x) for x in input().split()]index = find_center_index(nums)print(index)123456789101112131415161718192021222324252627
04-04
### 找到数组中左侧积等于右侧积的中心位置索引 要解决这个问题,可以采用一种高效的方法来计算数组中是否存在某个索引 `i`,使得该索引左侧所有元素的乘积等于右侧所有元素的乘积。以下是具体的解决方案: #### 方法描述 可以通过两次遍历完成此操作: 1. **第一次遍历**:从左向右扫描数组,依次累积左侧部分的乘积。 2. **第二次遍历**:从右向左扫描数组,依次累积右侧部分的乘积。 通过比较每次迭代的结果,找出满足条件的第一个索引并返回它。如果没有这样的索引存在,则返回 `-1`。 下面是基于上述逻辑的具体 Python 实现代码[^1]: ```python def find_center_index(nums): total_product = 1 for num in nums: if num != 0: # 防止零影响总乘积 total_product *= num left_product = 1 for i in range(len(nums)): current_element = nums[i] right_product = total_product / (current_element * left_product) if current_element != 0 else float('inf') if left_product == right_product and not math.isclose(left_product, float('inf')): return i if current_element != 0: left_product *= current_element return -1 ``` 注意,在实际应用过程中可能还需要考虑一些特殊情况处理,比如当数组中有零的情况或者浮点数精度误差等问题[^2]。 另外需要注意的是,这种方法假设输入数据不会导致整型溢出或其他数值异常情况发生;对于非常大的数组或含有特殊值的数据集,应进一步优化算法设计以提高健壮性和效率。 #### 示例测 给定如下几个例子验证函数行为: ```python print(find_center_index([2, 3, 4, 6])) # 输出应该是 2 或其他符合条件的位置 print(find_center_index([1, 2, 3, 4, 5])) # 可能无解,输出 -1 print(find_center_index([1, 1, 1, 1, 1])) # 多个潜在答案时给出第一个匹配项 ``` 以上即为利用Python实现寻找特定条件下数组中心索引的一种方法[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不太灵光的程序员

有用的话可以请博主喝杯咖啡续命

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

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

打赏作者

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

抵扣说明:

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

余额充值