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 的Document属性和方法集合
Jan 25 Javascript
js点击事件链接的问题解决
Apr 25 Javascript
BootStrap glyphicons 字体图标实现方法
May 01 Javascript
基于jQuery倒计时插件实现团购秒杀效果
May 13 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
Oct 21 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
Aug 17 Javascript
微信小程序日历效果
Dec 29 Javascript
vue-cli构建vue项目的步骤详解
Jan 27 Javascript
Vue axios 将传递的json数据转为form data的例子
Oct 29 Javascript
jQuery cookie的公共方法封装和使用示例
Jun 01 jQuery
three.js 制作动态二维码的示例代码
Jul 31 Javascript
echarts饼图各个板块之间的空隙如何实现
Dec 01 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实现无限级分类
2014/12/24 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
bootstrap下拉列表与输入框组结合的样式调整
2016/10/08 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
AngularJS路由Ui-router模块用法示例
2017/05/29 Javascript
使用vue2实现购物车和地址选配功能
2018/03/29 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
vue和better-scroll实现列表左右联动效果详解
2019/04/29 Javascript
js实现盒子拖拽动画效果
2020/08/09 Javascript
详解Vue 的异常处理机制
2020/11/30 Vue.js
python访问sqlserver示例
2014/02/10 Python
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
2015/05/16 Python
Python创建模块及模块导入的方法
2015/05/27 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
2019/08/20 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
Elemental Herbology官网:英国美容品牌
2019/04/27 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
ZWILLING双立人法国网上商店:德国刀具锅具厨具品牌
2019/08/28 全球购物
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
如何写一份好的自荐信
2014/01/02 职场文书
土木建筑学生自我评价
2014/01/14 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
矛盾论读书笔记
2015/06/29 职场文书
导游词之山西-五老峰
2019/10/07 职场文书
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers