如何在华为OD机试中获得满分?JavaScript实现【数组的中心位置】一文详解 |
您所在的位置:网站首页 › js如何获取数组的长度和宽度 › 如何在华为OD机试中获得满分?JavaScript实现【数组的中心位置】一文详解 |
✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: JS华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. JavaScript算法源码5. 测试输入输出6.解题思路 1. 题目描述给你一个整数数组nums,请计算数组的中心位置,数组的中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相乘的积。数组第一个元素的左侧积为1,最后一个元素的右侧积为1。如果数组有多个中心位置,应该返回最靠近左边的那一个,如果数组不存在中心位置,返回-1。 2. 输入描述输入只有一行,给出N个正整数用空格分隔,nums = 2 5 3 6 5 6 1 let leftMulti = 1; for (let i = 0; i rightMulti *= nums[i]; } if (leftMulti === rightMulti) { list.push(middle); } if (leftFlag) { if (middle > 1) { middle--; continue; } else { leftFlag = false; rightFlag = true; middle = Math.floor(n / 2); } } if (rightFlag) { if (middle break; } } } if (list.length === 0) { return -1; } else { list.sort((a, b) => a - b); return list[0]; } } 5. 测试 输入2 5 3 6 5 6 输出3 6.解题思路 读取输入的整数数组nums。获取数组的长度n。初始化中间位置middle为n / 2。初始化左边乘积的标志leftFlag为true,右边乘积的标志rightFlag为false。创建一个列表list,用于存储中心位置的下标。进入一个无限循环,直到找到中心位置或完成搜索。在循环中,计算左边数的乘积和右边数的乘积,并将它们进行比较。如果左边乘积等于右边乘积,将当前中心位置加入到list中。如果左边乘积的标志leftFlag为true,将中心位置向左移动一位,如果已经到达数组的最左边,则将左边乘积的标志设为false,右边乘积的标志设为true,并将中心位置重置为n / 2。如果右边乘积的标志rightFlag为true,将中心位置向右移动一位,如果已经到达数组的最右边,则退出循环。循环结束后,检查列表list的大小。如果列表为空,表示数组不存在中心位置,输出-1。否则,将列表list排序,并输出最靠近左边的中心位置的下标。该算法的时间复杂度为O(N),其中N是数组的长度。在最坏情况下,需要遍历整个数组来计算左边和右边的乘积。最终的空间复杂度取决于列表list的大小,即O(1)到O(N)之间。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |