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响应鼠标点击实现两个滑块区间拖动效果
Oct 26 Javascript
javascript实现PC网页里的拖拽效果
Mar 14 Javascript
jQuery获取当前点击的对象元素(实现代码)
May 19 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
Sep 19 Javascript
微信小程序 下拉菜单简单实例
Apr 13 Javascript
vue.js评论发布信息可插入QQ表情功能
Aug 08 Javascript
Vue.js devtool插件安装后无法使用的解决办法
Nov 27 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
Jan 25 Javascript
JavaScript实现微信红包算法及问题解决方法
Apr 26 Javascript
Vue分页器实现原理详解
Jun 28 Javascript
js实现抽奖功能
Nov 24 Javascript
JavaScript缓动动画函数的封装方法
Nov 25 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&amp;mysql(一)
2006/10/09 PHP
将文件夹压缩成zip文件的php代码
2009/12/14 PHP
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
orm获取关联表里的属性值
2016/04/17 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
2017/08/15 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
Jquery中对数组的操作代码
2011/08/12 Javascript
jQuery提交多个表单的小例子
2013/06/30 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
jQuery中队列queue()函数的实例教程
2016/05/03 Javascript
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
2016/05/09 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
jQuery select自动选中功能实现方法分析
2016/11/28 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
Python中几种操作字符串的方法的介绍
2015/04/09 Python
python简单判断序列是否为空的方法
2015/06/30 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
Python中turtle作图示例
2017/11/15 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
pygame实现成语填空游戏
2019/10/29 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
python调用百度API实现人脸识别
2020/11/17 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
轻松制作精彩视频:Animoto
2018/09/19 全球购物
师范生免费教育协议书范本
2014/10/09 职场文书
导游词之广西漓江
2019/11/02 职场文书