全网最全面的华为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);
}
}
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...
