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 相关文章推荐
js三种排序算法分享
Aug 16 Javascript
php 中序列化和json使用介绍
Jul 08 Javascript
jquery鼠标停止移动事件
Dec 21 Javascript
解决jquery中美元符号命名冲突问题
Jan 08 Javascript
Javascript和Java获取各种form表单信息的简单实例
Feb 14 Javascript
jquery 无限级下拉菜单的简单实现代码
Feb 21 Javascript
js获取IP地址的方法小结
Jul 01 Javascript
jQuery制作仿Mac Lion OS滚动条效果
Feb 10 Javascript
JS限制条件补全问题实例分析
Dec 16 Javascript
微信JS SDK接入的几点注意事项(必看篇)
Jun 23 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
Sep 26 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
Aug 22 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
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
JavaScript 封装Ajax传递的数据代码
2009/06/05 Javascript
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
JS格式化数字保留两位小数点示例代码
2013/10/15 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
VUE脚手架的下载和配置步骤详解
2019/04/01 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
2020/05/12 Javascript
vue-resource 拦截器interceptors使用详解
2021/01/18 Vue.js
详解Python的Django框架中的templates设置
2015/05/11 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
Python运维之获取系统CPU信息的实现方法
2018/06/11 Python
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
python urllib爬虫模块使用解析
2019/09/05 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
HTML5中drawImage用法分析
2014/12/01 HTML / CSS
CAT鞋美国官网:CAT Footwear
2017/11/27 全球购物
德国家具折扣店:POCO
2020/02/28 全球购物
酒吧员工的岗位职责
2013/11/26 职场文书
三年级学生评语
2014/04/23 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
2014审计局领导班子民主生活会对照检查材料思想汇报
2014/09/20 职场文书
美丽心灵观后感
2015/06/01 职场文书
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript