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

题目描述

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

输入

2 5 3 6 5 6

输出

3

题意解读

左侧积:该元素左侧所有元素的乘积;
右侧积:该元素右侧所有元素的乘积;

例如元素3,他的左侧积是 2*5 = 10. 他的右侧积是6*5*6 = 180
2023华为OD机试真题【计算数组中心位置】【Java Python C++】_第1张图片

数组的中心位置指的是:该元素的 左侧积 等于 右侧积

解题思路

遍历整个数组,在遍历的过程中,计算当前元素左侧所有元素的乘积leftProduct )和右侧所有元素乘积rightProduct ),当leftProduct == rightProduct,表示找到了中心位置。

那么,如何初始化左侧积leftProduct 和右侧积 rightProduct 呢?leftProduct 初始值为 1,rightProduct初始值是所有元素相乘。

初始化完成后,开始遍历数组,从左到右的顺序遍历 。对于当前位置 i,首先更新左侧积(如果 i 不是第一个元素,那么左侧积为 leftProduct * nums[i-1]),然后更新右侧积(rightProduct / nums[i])。

如果左侧积和右侧积相等,则表示i就是中心点。

视频讲解

2023华为机试真题【计算数组中心位置】

示例代码(Java版本)

import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;

class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 输入
        List<Integer> nums = Arrays.stream(in.nextLine().split(" "))
                .map(Integer::parseInt)
                .collect(Collectors.toList());

        // 处理边界情况:数组长度为1
        if (nums.size() == 1) {
            System.out.println(0);
            return;
        }

        // 左侧积和右侧积
        int leftProduct = 1;
        int rightProduct = 1;

        // 计算右侧积
        for (int i = 0; i < nums.size(); i++) {
            rightProduct = rightProduct * nums.get(i);
        }

        // 寻找中心位置
        for (int i = 0; i < nums.size(); i++) {
            if (i != 0) {
                leftProduct = leftProduct * nums.get(i - 1);
            }
            rightProduct = rightProduct / nums.get(i);
            if (leftProduct == rightProduct) {
                System.out.print(i);
                return;
            }
        }

        // 未找到中心位置
        System.out.println(-1);
    }
}

示例代码(C++版本)

#include 
#include 
#include 
#include 
using namespace std;

int find_center(vector<int> nums) {
    if (nums.size() == 1) {
        return 0;
    }

    int left_product = 1;
    int right_product = 1;

    // 右侧所有元素的乘积
    for (int num : nums) {
        right_product *= num;
    }

    for (size_t i = 0; i < nums.size(); ++i) {
        if (i != 0) {
            // 更新左侧乘积
            left_product *= nums[i - 1];
        }

        // 更新右侧乘积
        right_product /= nums[i];

        // 检查是否找到中心位置
        if (left_product == right_product) {
            return i;
        }
    }

    return -1;
}

int main() {
    string input_str;
    // 输入
    getline(cin, input_str);

    // 空格分割
    vector<int> nums;
    stringstream ss(input_str);
    int num;
    while (ss >> num) {
        nums.push_back(num);
    }

    cout << find_center(nums) << endl;

    return 0;
}


示例代码(Python版本)

def main():
    # 处理
    input_str = input()
    nums = [int(x) for x in input_str.split(" ")]

    if len(nums) == 1:
        print(0)
    else:
        left_product = 1
        right_product = 1
        flag = False

        for num in nums:
            right_product *= num

        for i in range(len(nums)):
            if i != 0:
                left_product *= nums[i - 1]

            right_product //= nums[i]

            if left_product == right_product:
                print(i)
                flag = True
                break

        if not flag:
            print(-1)

if __name__ == "__main__":
    main()

你可能感兴趣的:(java,开发语言,华为机试,贪心算法,算法)