百度&必应权4, 日IP1w+ 查看详情
自助收录

2023年华为OD机考真题:数组的中心位置

算法刷题2年前 (2023)更新 江南白衣
544 0 0
2023年华为OD机考真题:数组的中心位置

全网最全面的华为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);
        }
    }

}
© 版权声明

相关文章

暂无评论

暂无评论...