华为OD机试真题 Python 实现【数组的中心位置】【2023Q1 100分】,附详细解题思路-LMLPHP

一、题目描述

给你一个整数数组nums,请计算数组的中心位置,数组的中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相乘的积。数组第一个元素的左侧积为1,最后一个元素的右侧积为1。如果数组有多个中心位置,应该返回最靠近左边的那一个,如果数组不存在中心位置,返回-1。

二、输入描述

输入只有一行,给出N个正整数用空格分隔,nums = 2 5 3 6 5 6

1 <= nums.length <= 1024

1 <= nums[i] <= 10

三、输出描述

3

四、解题思路

  1. 读取输入的整数数组nums
  2. 获取数组的长度n
  3. 初始化中间位置middlen / 2
  4. 初始化左边乘积的标志leftFlagtrue,右边乘积的标志rightFlagfalse
  5. 创建一个列表list,用于存储中心位置的下标。
  6. 进入一个无限循环,直到找到中心位置或完成搜索。
  7. 在循环中,计算左边数的乘积和右边数的乘积,并将它们进行比较。
  8. 如果左边乘积等于右边乘积,将当前中心位置加入到list中。
  9. 如果左边乘积的标志leftFlagtrue,将中心位置向左移动一位,如果已经到达数组的最左边,则将左边乘积的标志设为false,右边乘积的标志设为true,并将中心位置重置为n / 2
  10. 如果右边乘积的标志rightFlagtrue,将中心位置向右移动一位,如果已经到达数组的最右边,则退出循环。
  11. 循环结束后,检查列表list的大小。
  12. 如果列表为空,表示数组不存在中心位置,输出-1。
  13. 否则,将列表list排序,并输出最靠近左边的中心位置的下标。

该算法的时间复杂度为O(N),其中N是数组的长度。在最坏情况下,需要遍历整个数组来计算左边和右边的乘积。最终的空间复杂度取决于列表list的大小,即O(1)O(N)之间。

五、Python算法源码

a=input().split()
b=[int(i) for i in a]
l=1
r=1
mid=[]
for i in range(0,len(b)):
    for j in b[:i]:
        l=j*l
    for k in b[i+1:]:
        r=r*k
    if l==r:
        mid.append(i)
    l=1
    r=1
if len(mid)>0:
    print(mid[0])
else:
    print("-1")

六、效果展示

1、输入

2 5 3 6 5 6

2、输出

3

华为OD机试真题 Python 实现【数组的中心位置】【2023Q1 100分】,附详细解题思路-LMLPHP


🏆下一篇:华为OD机试真题 Python 实现【相对开音节】【2022Q4 100分】,附详细解题思路

🏆本文收录于,华为OD机试(Python)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

华为OD机试真题 Python 实现【数组的中心位置】【2023Q1 100分】,附详细解题思路-LMLPHP

07-05 11:04