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 面向对象编程 function也是类
Sep 17 Javascript
js/jQuery简单实现选项卡功能
Jan 02 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
Jun 05 Javascript
再次谈论Javascript中的this
Jun 23 Javascript
用原生JS对AJAX做简单封装的实例代码
Jul 13 Javascript
vue开发心得和技巧分享
Oct 27 Javascript
vue路由嵌套的SPA实现步骤
Nov 06 Javascript
Bootstrap 按钮样式与使用代码详解
Dec 09 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
Jun 10 Javascript
利用JS如何获取form表单数据
Dec 19 Javascript
vue 翻页组件vue-flip-page效果
Feb 05 Javascript
Vue基于localStorage存储信息代码实例
Nov 16 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
盘点被央视点名过的日本动画电影 一部比一部强
2020/03/08 日漫
php在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
jQuery的缓存机制浅析
2014/06/07 Javascript
Javascript学习笔记之数组的遍历和 length 属性
2014/11/23 Javascript
js控制文本框只输入数字和小数点的方法
2015/03/10 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
基于JS组件实现拖动滑块验证功能(代码分享)
2016/11/18 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
js正则相关知识点专题
2018/05/10 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
python3实现暴力穷举博客园密码
2016/06/19 Python
python调用摄像头显示图像的实例
2018/08/03 Python
Python运行不显示DOS窗口的解决方法
2018/10/22 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
2020/03/10 Python
基于python代码批量处理图片resize
2020/06/04 Python
简单的Python人脸识别系统
2020/07/14 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
应届毕业生个人自我评价
2013/09/20 职场文书
最美家庭活动方案
2014/08/31 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
公司人力资源管理制度
2015/08/05 职场文书
MySQL 十大常用字符串函数详解
2021/06/30 MySQL
处理canvas绘制图片模糊问题
2022/05/11 Javascript