一、题目描述
给你一个整数数组 nums,请计算数组的中心位置,数组的中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相的积。
数组第一个元素的左侧积为 1,最后一个元素的右侧积为 1。如果数组有多个中心位置,应该返回最靠近左边的那一个,如果数组不存在中心位置,返回-1。
二、输入描述
2 5 3 6 5 6
三、输出描述
3
四、解题思路
- 读取输入的整数数组 arr;
- 获取数组的长度 n;
- 初始化一个空的列表 list,用于存储可能的中心位置;
- 遍历数组元素的下标 i,从 0 到 n-1;
- 如果数组只有一个元素,即 n=1,则返回下标 0;
- 否则,进行以下步骤:
- 初始化变量 left 和 right 为 1,用于计算左侧和右侧的乘积;
- 对于下标从 0 到 i-1 的元素,累乘到变量 left;
- 对于下标从 i+1 到 n-1 的元素,累乘到变量 right;
- 如果左侧乘积等于右侧乘积,将当前下标 i 添加到列表 list 中;
- 如果列表 list 的长度为 0,表示数组不存在中心位置,返回 -1;
- 否则,列表中的第一个下标即为最靠近左边的中心位置,返回该下标;
五、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机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。