JS如何寻找数组中心索引过程解析


Posted in Javascript onJune 01, 2020

给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法。

我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。

如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。

示例 1:

输入:
nums = [1, 7, 3, 6, 5, 6]
输出: 3
解释:
索引3 (nums[3] = 6) 的左侧数之和(1 + 7 + 3 = 11),与右侧数之和(5 + 6 = 11)相等。
同时, 3 也是第一个符合要求的中心索引。

示例 2:

输入:
nums = [1, 2, 3]
输出: -1
解释:
数组中不存在满足此条件的中心索引。

说明:nums 的长度范围为 [0, 10000]。任何一个 nums[i] 将会是一个范围在 [-1000, 1000]的整数。

我们先分析,先说说我的实现思路,再来分享其他用户优质解答。

题目想传达的意思其实很明确了,当遍历到 i 时, i 左边所有元素(不包括i)的和与 i 右边所有元素(不包括i)的和相等,如果遍历过程中满足则返回 i,如果不满足则返回 -1。

我第一想到的就是每次遍历 i ,将数组左右分别拆分成两个数组,求和做比较,如果满足则返回 i ,如果未找到返回 -1;

JS如何寻找数组中心索引过程解析

事先提示这道题的坑,按照我的理解,比如一个数组[1,-1,1],其实只用比较i为1的情况。

因为当i为0时左边不存在元素,没比较的必要,i为2时右边没元素,也没必要比较,所以我最初循环的条件为:

for (var i = 1; i < nums.length - 1; i++) {}

然后提交就挂掉了,提示应该返回0而不是-1,也就是按照官方的理解,i为0时左边虽然没元素但和为0(我服了...)。

JS如何寻找数组中心索引过程解析

经过修改这里提供我的实现,比较粗暴:

/**
 * @param {number[]} nums
 * @return {number}
 */
var pivotIndex = function(nums) {
  var i = 0,
    // 左边的和
    sum_l = 0,
    // 右边的和
    sum_r = 0,
    len = nums.length;
  for (; i < len; i++) {
    // 由于i从0开始,nums[0 - 1]为undefined,计算会让结果变成NaN
    if(nums[i - 1]){
      sum_l += nums[i - 1];
    };
		// 截取i右边的数组求和
    nums.slice(i + 1).map(item => {
      sum_r += item;
    });
    // 比较判断,符合返回i
    if (sum_l == sum_r) {
      return i;
    } else {
      //每次比较完重置右边的和,免得遍历一次越来越大
      sum_r = 0;
    };
  };
  return -1;
};

提交一看时间,我人都傻了...

JS如何寻找数组中心索引过程解析

真是要了老命的算法,用了2S...

其实按照题目描述,我们可以知道数组所有元素的总和等于i+i左边和+i右边和,所以得出多种公式:

//左边的和 = (总和 - i)除以2
sumLeft = (sum - i)/2
//或者
sumLeft = sum - i - sumLeft

贴上实现代码:

/**
 * @param {number[]} nums
 * @return {number}
 */
var pivotIndex = function (nums) {
  var i = 0,
    len = nums.length,
    sum = 0,
    sumLeft = 0;
  // 求数组总和
  nums.map(item => sum += item);
  // 考虑左边没元素默认为0的情况,所以i为0时不进行sumLeft+=nums[i]的操作
  for (; i < len; i++) {
    if ((sum - nums[i]) / 2 === sumLeft) {
      return i;
    };
    sumLeft += nums[i];
  };
  return -1;
};

其实唯一需要注意的就是我前面说的坑,i为0时默认左边为0,所以我们是判断了一次后才执行sumLeft += nums[i]。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
分享JavaScript获取网页关闭与取消关闭的事件
Dec 13 Javascript
jQuery实现的仿select功能代码
Aug 19 Javascript
基于JavaScript实现移动端TAB触屏切换效果
Oct 20 Javascript
基于Jquery和html5的7款个性化地图插件
Nov 17 Javascript
jquery彩色投票进度条简单实例演示
Jul 23 Javascript
很全面的JavaScript常用功能汇总集合
Jan 22 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
Dec 29 Javascript
JS实现将二维数组转为json格式字符串操作示例
Jul 12 Javascript
React+TypeScript+webpack4多入口配置详解
Aug 08 Javascript
Windows上node.js的多版本管理工具用法实例分析
Nov 06 Javascript
使用Promise封装小程序wx.request的实现方法
Nov 13 Javascript
js实现数字跳动到指定数字
Aug 25 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
Jun 01 #Javascript
bootstrap-table后端分页功能完整实例
Jun 01 #Javascript
jQuery实现倒计时功能完整示例
Jun 01 #jQuery
微信小程序订阅消息(java后端实现)开发
Jun 01 #Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
Jun 01 #Javascript
微信小程序开发(二):页面跳转并传参操作示例
Jun 01 #Javascript
5个你不知道的JavaScript字符串处理库(小结)
Jun 01 #Javascript
You might like
西德产收音机
2021/03/01 无线电
php minixml详解
2008/07/19 PHP
php preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
PHP 魔术函数使用说明
2010/05/14 PHP
php单一接口的实现方法
2015/06/20 PHP
WordPress中对访客评论功能的一些优化方法
2015/11/24 PHP
实例讲解php数据访问
2016/05/09 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
PHP读取word文档的方法分析【基于COM组件】
2017/08/01 PHP
IE8提示Invalid procedure call or argument 异常的解决方法
2012/09/30 Javascript
用Javascript来生成ftp脚本的小例子
2013/07/03 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
vue框架制作购物车小球动画效果实例代码
2019/09/26 Javascript
微信小程序收藏功能的实现代码
2020/06/19 Javascript
解决新建一个vue项目过程中遇到的问题
2020/10/22 Javascript
python3+PyQt5实现柱状图
2018/04/24 Python
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
python 简单的调用有道翻译
2020/11/25 Python
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
一套比较完整的软件测试人员面试题
2012/05/13 面试题
有abstract方法的类一定要用abstract修饰吗
2016/03/14 面试题
我的教育故事演讲稿
2014/05/04 职场文书
民事起诉状范文
2015/05/19 职场文书
详解Node.js如何处理ES6模块
2021/05/15 Javascript
Golang的继承模拟实例
2021/06/30 Golang
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技