2024华为OD机试真题【计算数组中心位置】【C++】

这篇博客介绍了如何求解华为OD机试中的一道题目,即找到数组的中心位置,使得该位置左侧元素乘积等于右侧元素乘积。解题思路包括初始化左右侧积为1,然后遍历数组,比较左侧积和右侧积是否相等来确定中心位置。文章提供了一个C++的示例代码来解释解决方案。
摘要由CSDN通过智能技术生成

题目描述

给你一个整数数组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华为机试真题【计算数组中心位置】

示例代码(C++)

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int findCenterIndex(vector<int>& nums) {
    // 长度为1特殊情况
    if (nums.size() == 1) {
        return 0;
    }

    int n = nums.size();

    // 左侧和右侧的乘积
    vector<int> leftProduct(n, 1);
    vector<int> rightProduct(n, 1);

    // 计算每个位置的左侧乘积
    for (int i = 1; i < n; i++) {
        leftProduct[i] = leftProduct[i - 1] * nums[i - 1];
    }

    // 计算每个位置的右侧乘积
    for (int i = n - 2; i >= 0; i--) {
        rightProduct[i] = rightProduct[i + 1] * nums[i + 1];
    }

    // 比较左侧和右侧的乘积来找到中心索引
    for (int i = 0; i < n; i++) {
        if (leftProduct[i] == rightProduct[i]) {
            return i;
        }
    }

    // 如果没有找到中心索引,则返回-1
    return -1;
}

int main() {
    int n;
    vector<int> nums;
    while (cin >> n) {
        nums.push_back(n);
    }
    int index = findCenterIndex(nums);
    cout << index << endl;

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

codereasy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值