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 版本的文本输入框检查器Input Check
Jul 09 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
Jul 31 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
Nov 05 Javascript
JQuery对表单元素的基本操作使用总结
Jul 18 Javascript
浅析Javascript的自动分号插入(ASI)机制
Sep 29 Javascript
简单理解js的prototype属性及使用
Dec 07 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
Dec 13 Javascript
vue 里面使用axios 和封装的示例代码
Sep 01 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
Nov 14 Javascript
JS实现提示效果弹出及延迟隐藏的功能
Aug 26 Javascript
使用Angular material主题定义自己的组件库的配色体系
Sep 04 Javascript
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
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 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
php结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
无缝滚动的简单实现代码(推荐)
2016/06/07 Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
2017/03/01 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
javascript实现文本框标签验证的实例代码
2018/10/14 Javascript
bootstrap table合并行数据并居中对齐效果
2018/10/17 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
2019/05/16 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
Vue中实现回车键切换焦点的方法
2020/02/19 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
PyMongo安装使用笔记
2015/04/27 Python
python opencv之分水岭算法示例
2018/02/24 Python
python设定并获取socket超时时间的方法
2019/01/12 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
2019/02/01 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
Java面向对象面试题
2016/12/26 面试题
污水厂厂长岗位职责
2014/01/04 职场文书
上班离岗检讨书
2014/01/27 职场文书
体育教学随笔感言
2014/02/24 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
质量整改通知单
2015/04/21 职场文书
公司考勤管理制度
2015/08/04 职场文书
运动会主持人开幕词
2016/03/04 职场文书