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 typeof 用法
Dec 28 Javascript
yepnope.js 异步加载资源文件
Sep 08 Javascript
javascript使用smipleChart实现简单图表
Jan 02 Javascript
jQuery实现Email邮箱地址自动补全功能代码
Nov 03 Javascript
js实现精确到秒的日期选择器完整实例
Apr 30 Javascript
D3.js进阶系列之CSV表格文件的读取详解
Jun 06 Javascript
详解vue 模版组件的三种用法
Jul 21 Javascript
vue不通过路由直接获取url中参数的方法示例
Aug 24 Javascript
zTree树形菜单交互选项卡效果的实现方法
Dec 25 Javascript
jQuery使用each遍历循环的方法
Sep 19 jQuery
微信小程序错误this.setData报错及解决过程
Sep 18 Javascript
通过js随机函数Math.random实现乱序
May 19 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
php&amp;java(三)
2006/10/09 PHP
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
vue.js图片转Base64上传图片并预览的实现方法
2018/08/02 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
2019/07/31 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
Cython 三分钟入门教程
2009/09/17 Python
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
python赋值操作方法分享
2013/03/23 Python
Python 异常处理实例详解
2014/03/12 Python
python操作xml文件示例
2014/04/07 Python
Python开发的HTTP库requests详解
2017/08/29 Python
通过cmd进入python的实例操作
2019/06/26 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
更夫岗位责任制
2014/02/11 职场文书
搞笑婚礼主持词
2014/03/13 职场文书
优秀毕业生的求职信
2014/07/21 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
承诺书模板
2014/08/30 职场文书
标准单位租车协议书
2014/09/23 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
小学教师岗位职责
2015/04/02 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
食品药品安全责任书
2015/05/11 职场文书
新年祝酒词大全
2015/08/11 职场文书
任命书格式模板
2015/09/22 职场文书
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL