全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。
真题库:https://www.yuque.com/codernav.com/od
题目:数组的中心位置
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
给你一个整数数组nums,请计算数组的中心位置 。数组中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相乘的积。
数组第一个元素的左侧积为1,最后一个元素的右侧积为1
如果数组有多个中心位置,应该返回最靠近左边的那一个。如果数组不存在中心位置,返回 -1 。
输入描述:
输入只有一行,给出N个正整数用空格分格:nums = 2 5 3 6 5 6
1 <= nums.length <= 1024
1 <= nums[i] <= 10
输出描述:
输出:3
解释:
中心位置是 3 。
左侧数之积 sum = nums[0] * nums[1] * nums[2] = 2 * 5 * 3 = 30 ,
右侧数之积 sum = nums[4] * nums[5] = 5 * 6 = 30 ,二者相等。
示例1
输入:
2 5 3 6 5 6
输出:
3
解题思路:
先求出左侧和右侧的前缀积
再遍历数组,比较其左右侧前缀积;如果相同,则输出其坐标。
注意题目:数组第一个元素的左侧积为1,最后一个元素的右侧积为1。另外,力扣上有一道差不多的题,不过不是乘积,是求和,不要看错了。
代码实现一:
package com.codernav.demo.hwod.exam; import java.util.Arrays; import java.util.Scanner; /** * @title 数组的中心位置 * @Description 给你一个整数数组nums, 请计算数组的中心位置 。数组中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相乘的积。 * 数组第一个元素的左侧积为1,最后一个元素的右侧积为1 * 如果数组有多个中心位置,应该返回最靠近左边的那一个。如果数组不存在中心位置,返回 -1 。 * @Author 开发者导航 * @website https://codernav.com * @date 2023/5/13 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] strings = sc.nextLine().split(" "); int len = strings.length; int[] nums = Arrays.stream(strings).mapToInt(Integer::parseInt).toArray(); int[] leftProduct = new int[len]; //左侧前缀积 leftProduct[0] = nums[0]; for (int i = 1; i < len; i++) { leftProduct[i] = leftProduct[i - 1] * nums[i]; } int[] rightProduct = new int[len]; //右侧前缀积 rightProduct[len - 1] = nums[len - 1]; for (int i = len - 2; i >= 0; i--) { rightProduct[i] = rightProduct[i + 1] * nums[i]; } int res = -1; if (rightProduct[1] == 1) { //根据题意,0的左侧积为1,如果右侧积也为1则中心位置为0 res = 0; } else { for (int i = 1; i < len; i++) { if (i == len - 1) { if (leftProduct[i - 2] == 1) { res = len - 1; //根据题意,len-1的右侧积为1,如果左侧积也为1则中心位置为len-1 } } else if (leftProduct[i - 1] == rightProduct[i + 1]) { //左侧积等于右侧积 res = i; break; } } } System.out.println(res); } }
代码实现二:
package com.codernav.demo.hwod.exam; import java.util.Arrays; import java.util.Scanner; /** * @title 数组的中心位置 * @Description 给你一个整数数组nums, 请计算数组的中心位置 。数组中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相乘的积。 * 数组第一个元素的左侧积为1,最后一个元素的右侧积为1 * 如果数组有多个中心位置,应该返回最靠近左边的那一个。如果数组不存在中心位置,返回 -1 。 * @Author 开发者导航 * @website https://codernav.com * @date 2023/5/13 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] strings = sc.nextLine().split(" "); int len = strings.length; int[] nums = Arrays.stream(strings).mapToInt(Integer::parseInt).toArray(); //题目说:数组第一个元素的左侧积为1,最后一个元素的右侧积为1 int left = 1, right = 1; for (int num : nums) { right = right * num; //数组的总乘积 } boolean flag = false; for (int i = 0; i < len; i++) { if (i != 0) { left = left * nums[i - 1]; //左侧积做乘法 } right = right / nums[i]; //右侧积做除法 if (left == right) { System.out.print(i); flag = true; break; } } if (!flag) { System.out.println(-1); } } }
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...