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 相关文章推荐
文字幻灯片
Jun 26 Javascript
JavaScript 数组详解
Oct 10 Javascript
JS组件Bootstrap实现下拉菜单效果代码
Apr 26 Javascript
详解JavaScript中基于原型prototype的继承特性
May 05 Javascript
移动开发之自适应手机屏幕宽度
Nov 23 Javascript
将鼠标焦点定位到文本框最后(代码分享)
Jan 11 Javascript
基于LayUI实现前端分页功能的方法
Jul 22 Javascript
layer.confirm取消按钮绑定事件的方法
Aug 17 Javascript
微信小程序实现卡片层叠滑动效果
Jun 21 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
Sep 18 Javascript
聊聊Vue中provide/inject的应用详解
Nov 10 Javascript
Node.js 在本地生成日志文件的方法
Feb 07 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
VFP与其他应用程序的集成
2006/10/09 PHP
获取远程文件大小的php函数
2010/01/11 PHP
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
php字符串操作常见问题小结
2016/10/11 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
eclipse如何忽略js文件报错(附图)
2013/10/30 Javascript
node.js使用require()函数加载模块
2014/11/26 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
基于jquery实现下拉框美化特效
2016/02/02 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
2018/05/27 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
Python二分查找详解
2015/09/13 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
navabi英国:设计师大码女装
2019/06/25 全球购物
DBA的职责都有哪些
2012/05/16 面试题
学生会主席演讲稿
2014/04/25 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
Python实现滑雪小游戏
2021/09/25 Python