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 相关文章推荐
jQuery EasyUI 中文API Layout(Tabs)
Apr 27 Javascript
使用javascript实现Iframe自适应高度
Dec 24 Javascript
jquery实现的Banner广告收缩效果代码
Sep 02 Javascript
在页面中输出当前客户端时间javascript实例代码
Mar 02 Javascript
使用gulp搭建本地服务器并实现模拟ajax
Apr 05 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
Aug 03 Javascript
详解html-webpack-plugin用法全解
Jan 22 Javascript
Node.js 使用jade模板引擎的示例
May 11 Javascript
微信小程序实现简单表格
Feb 14 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
Apr 25 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
Sep 16 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
Aug 03 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数组合并与拆分实例分析
2015/06/12 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
JavaScript 学习笔记(四)
2009/12/31 Javascript
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
深入理解Angular4中的依赖注入
2017/06/07 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
2018/11/30 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
Python用GET方法上传文件
2015/03/10 Python
Python守护进程和脚本单例运行详解
2017/01/06 Python
带你了解python装饰器
2017/06/15 Python
python的mysqldb安装步骤详解
2017/08/14 Python
Python入门之三角函数sin()函数实例详解
2017/11/08 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
详解Python3中的 input() 函数
2020/03/18 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
什么是Python包的循环导入
2020/09/08 Python
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
奥巴马胜选演讲稿
2014/05/15 职场文书
校长一岗双责责任书
2015/05/09 职场文书
政协常委会议主持词
2015/07/03 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python