JS求解两数之和算法详解


Posted in Javascript onApril 28, 2020

本文实例讲述了JS求解两数之和算法。分享给大家供大家参考,具体如下:

题目描述

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

::: tip
给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
:::

解法

利用 Map 记录数组元素值和对应的下标,对于一个数 nums[i],判断 target - nums[i] 是否存在 Map

var twoSum = function(nums, target) {
 const _length = nums.length;
 const _mayMap = new Map();
 for (let i = 0; i < _length; i++) {
 if (_mayMap.has(target - nums[i])) {
  return [_mayMap.get(target - nums[i]), i];
 }
 _mayMap.set(nums[i], i);
 }
};

Map回顾

Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

new Map([iterable])

Iterable 可以是一个数组或者其他 iterable 对象,其元素为键值对(两个元素的数组,例如:[[ 1, 'one' ],[ 2, 'two' ]])。 每个键值对都会添加到新的 Mapnull 会被当做 undefined

Objectsmaps 的比较

ObjectsMaps 类似的是,它们都允许你按键存取一个值、删除键、检测一个键是否绑定了值。

因此(并且也没有其他内建的替代方式了)过去我们一直都把对象当成 Maps 使用。

不过 MapsObjects 有一些重要的区别,在下列情况里使用 Map 会是更好的选择:

一个Object的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值,包括函数、对象、基本类型。

Map 中的键值是有序的,而添加到对象中的键则不是。因此,当对它进行遍历时,Map 对象是按插入的顺序返回键值。

可以通过 size 属性直接获取一个Map的键值对个数,而 Object的键值对个数只能手动计算。

Map 可直接进行迭代,而 Object 的迭代需要先获取它的键数组,然后再进行迭代。

Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
虽然 ES5 开始可以用 map = Object.create(null) 来创建一个没有原型的对象,但是这种用法不太常见。

Map 在涉及频繁增删键值对的场景下会有些性能优势。

属性

Map.length
属性 length 的值为 0 。

get Map[@@species]
本构造函数用于创建派生对象。

Map.prototype
表示 Map 构造器的原型。 允许添加属性从而应用于所有的 Map 对象。

所有的 Map 对象实例都会继承 Map.prototype。

Map.prototype.constructor
返回一个函数,它创建了实例的原型。默认是Map函数。

Map.prototype.size
返回Map对象的键/值对的数量。

Map.prototype.clear()
移除Map对象的所有键/值对 。

Map.prototype.delete(key)
如果 Map 对象中存在该元素,则移除它并返回 true;否则如果该元素不存在则返回 false

Map.prototype.entries()
返回一个新的 Iterator 对象,它按插入顺序包含了Map对象中每个元素的 [key, value] 数组。

Map.prototype.forEach(callbackFn[, thisArg])
按插入顺序,为 Map对象里的每一键值对调用一次callbackFn函数。如果为forEach提供了thisArg,它将在每次回调中作为this值。

Map.prototype.get(key)
返回键对应的值,如果不存在,则返回undefined。

Map.prototype.has(key)
返回一个布尔值,表示Map实例是否包含键对应的值。

Map.prototype.keys()
返回一个新的 Iterator对象, 它按插入顺序包含了Map对象中每个元素的键 。

Map.prototype.set(key, value)
设置Map对象中键的值。返回该Map对象。

Map.prototype.values()
返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的值 。

Map.prototype[@@iterator]()
返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的 [key, value] 数组。

例子

var myMap = new Map();

var keyObj = {},
 keyFunc = function () {},
 keyString = "a string";

// 添加键
myMap.set(keyString, "和键'a string'关联的值");
myMap.set(keyObj, "和键keyObj关联的值");
myMap.set(keyFunc, "和键keyFunc关联的值");

myMap.size; // 3

// 读取值
myMap.get(keyString); // "和键'a string'关联的值"
myMap.get(keyObj);  // "和键keyObj关联的值"
myMap.get(keyFunc);  // "和键keyFunc关联的值"

myMap.get("a string"); // "和键'a string'关联的值"
       // 因为keyString === 'a string'
myMap.get({});   // undefined, 因为keyObj !== {}
myMap.get(function() {}) // undefined, 因为keyFunc !== function () {}

传递数据

let valuesMap = new Map();

class payserviceclass {
 constructor() {}
 getItem(key) {
 const stringKey = String(key);
 if (valuesMap.has(key)) {
  return valuesMap.get(stringKey);
 }
 return null;
 }
 setItem(key, val) {
 return valuesMap.set(String(key), val);
 }

 clear() {
 return valuesMap.clear();
 }
}
const payservice = new payserviceclass();

export default payservice;

参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Jquery 快速构建可拖曳的购物车DragDrop
Nov 30 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
Dec 17 Javascript
JS之Date对象和获取系统当前时间详解
Jan 13 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
Apr 15 Javascript
jQuery团购倒计时特效实现方法
May 07 Javascript
Vuejs第十篇之vuejs父子组件通信
Sep 06 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
Aug 27 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
Feb 16 Javascript
vue+axios新手实践实现登陆的示例代码
Jun 06 Javascript
vue路由教程之静态路由
Sep 03 Javascript
使用layui的router来进行传参的实现方法
Sep 06 Javascript
在vue中使用eslint,配合vscode的操作
Nov 09 Javascript
jQuery插件simplePagination的使用方法示例
Apr 28 #jQuery
uni-app如何页面传参数的几种方法总结
Apr 28 #Javascript
JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】
Apr 28 #Javascript
JS 创建对象的模式实例小结
Apr 28 #Javascript
JavaScript console的使用方法实例分析
Apr 28 #Javascript
Node.js设置定时任务之node-schedule模块的使用详解
Apr 28 #Javascript
JavaScript Date对象功能与用法学习记录
Apr 28 #Javascript
You might like
php 从数据库提取二进制图片的处理代码
2009/09/09 PHP
PHP的引用详解
2015/02/22 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
jQuery EasyUI API 中文文档 - Pagination分页
2011/09/29 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
2015/08/21 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
2016/04/23 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
JavaScript中的this基本问题实例小结
2020/03/09 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
Python sys.path详细介绍
2013/10/17 Python
Python实现身份证号码解析
2015/09/01 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
Sanic框架流式传输操作示例
2018/07/18 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
2019/04/11 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
年度考核自我鉴定
2013/11/09 职场文书
秘书行业自我鉴定范文
2013/12/30 职场文书
超市中秋节活动方案
2014/02/12 职场文书
财务会计求职信范文
2015/03/20 职场文书
检举信的写法
2019/04/10 职场文书
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫