一、题目描述

给你一个整数数组 nums,请计算数组的中心位置,数组的中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相的积。

数组第一个元素的左侧积为 1,最后一个元素的右侧积为 1。如果数组有多个中心位置,应该返回最靠近左边的那一个,如果数组不存在中心位置,返回-1。

二、输入描述

2 5 3 6 5 6

三、输出描述

3

四、解题思路

  1. 读取输入的整数数组 arr;
  2. 获取数组的长度 n;
  3. 初始化一个空的列表 list,用于存储可能的中心位置;
  4. 遍历数组元素的下标 i,从 0 到 n-1;
    • 如果数组只有一个元素,即 n=1,则返回下标 0;
    • 否则,进行以下步骤:
      • 初始化变量 left 和 right 为 1,用于计算左侧和右侧的乘积;
      • 对于下标从 0 到 i-1 的元素,累乘到变量 left;
      • 对于下标从 i+1 到 n-1 的元素,累乘到变量 right;
      • 如果左侧乘积等于右侧乘积,将当前下标 i 添加到列表 list 中;
  5. 如果列表 list 的长度为 0,表示数组不存在中心位置,返回 -1;
  6. 否则,列表中的第一个下标即为最靠近左边的中心位置,返回该下标;

五、Java算法源码

/**
 * 数组的中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相的积
 */
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String[] arr = sc.nextLine().split(" ");
    int n = arr.length;
    List<Integer> list = new ArrayList<>();
    for (int i = 0; i < n; i++) {
        if (n == 1) {
            // 如果只有1个元素,返回当前坐标
            System.out.print(0);
            return;
        } else {
            int left = 1;
            int right = 1;
            // 暴力算法
            // 计算当前元素左侧 所有元素乘积
            for (int j = 0; j < i; j++) {
                left *= Integer.parseInt(arr[j]);
            }

            // 计算当前元素右侧 所有元素乘积
            for (int k = i + 1; k < n; k++) {
                right *= Integer.parseInt(arr[k]);
            }

            // 左侧所有元素相乘的积等于右侧所有元素相的积
            if (left == right) {
                list.add(i);
            }
        }
    }

    // 数组不存在中心位置,返回-1。
    if (list.size() == 0) {
        System.out.println(-1);
        return;
    }
    
    // 如果数组有多个中心位置,应该返回最靠近左边的那一个,也就是第一个
    System.out.print(list.get(0));
}

六、效果展示

1、输入

5 6 7 3 2 5

2、输出

2

3、说明

数组的中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相的积。

这道题属于送分了,很简单。

5 * 6 = 3 * 2 * 5 = 30,故输出2。

华为OD机试真题B卷 Java 实现【计算数组中心位置】,附详细解题思路-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

05-31 02:38