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 相关文章推荐
File, FileReader 和 Ajax 文件上传实例分析(php)
Apr 27 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
Oct 04 Javascript
js 判断js函数、变量是否存在的简单示例代码
Mar 04 Javascript
jQuery/CSS3图片特效插件整理推荐
Dec 07 Javascript
javaScript中push函数用法实例分析
Jun 08 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
Aug 13 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
Aug 02 Javascript
浅谈jQuery中的checkbox问题
Aug 10 Javascript
Angular2自定义分页组件
Apr 19 Javascript
详解如何用模块化的方式写vuejs
Dec 16 Javascript
关于vue中 $emit的用法详解
Apr 12 Javascript
浅谈layui 表单元素的选中问题
Oct 25 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
世界第一个无线广播电台 KDKA
2021/03/01 无线电
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
php简单实现数组分页的方法
2016/04/30 PHP
JavaScript版代码高亮
2006/06/26 Javascript
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
麻雀虽小五脏俱全 Dojo自定义控件应用
2010/09/04 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
JavaScript操作表单实例讲解(上)
2016/06/20 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
浅谈ng-zorro使用心得
2018/12/03 Javascript
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
一些Python中的二维数组的操作方法
2015/05/02 Python
Python管理Windows服务小脚本
2018/03/12 Python
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
python selenium执行所有测试用例并生成报告的方法
2019/02/13 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
应届大学生求职信
2013/12/01 职场文书
学生爱国演讲稿
2014/01/14 职场文书
还款承诺书范本
2015/01/20 职场文书