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玩转继承(三)
May 08 Javascript
JavaScript中的ArrayBuffer详细介绍
Dec 08 Javascript
jQuery实现日期联动效果实例
Jul 26 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
Jul 02 Javascript
jquery获取transform里的值实现方法
Dec 12 jQuery
JavaScript创建对象方法实例小结
Sep 03 Javascript
使用JS获取页面上的所有标签
Oct 18 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
Oct 18 Javascript
浅谈JavaScript 代码简洁之道
Jan 09 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
Aug 27 jQuery
vue element 中的table动态渲染实现(动态表头)
Nov 21 Javascript
如何使用gpu.js改善JavaScript的性能
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
关于PHP5 Session生命周期介绍
2010/03/02 PHP
php 错误处理经验分享
2011/10/11 PHP
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
url地址自动加#号问题说明
2010/08/21 Javascript
JS将制定内容复制到剪切板示例代码
2014/02/11 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
Nodejs实现爬虫抓取数据实例解析
2018/07/05 NodeJs
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
在Python 的线程中运行协程的方法
2020/02/24 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
python从PDF中提取数据的示例
2020/10/30 Python
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
Lookfantastic阿联酋官网:英国知名美妆护肤购物网站
2020/05/26 全球购物
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
求职信模版
2013/11/30 职场文书
学生喝酒检讨书
2014/02/06 职场文书
初三新学期计划书
2014/05/03 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
简易版租房协议书范本
2014/10/13 职场文书
学校师德师风整改措施
2014/10/27 职场文书
党员民主生活会材料
2014/12/15 职场文书
复试通知单模板
2015/04/24 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
辩护词范文大全
2015/05/21 职场文书
MySQL 数据类型详情
2021/11/11 MySQL
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技