每日前言:
有子曰:“其為人也孝弟偏形,而好犯上者,鮮矣觉鼻;不好犯上俊扭,而好作亂者,未之有也坠陈。君子務(wù)本萨惑,本立而道生。孝弟也者仇矾,其為仁之本與庸蔼?”
子曰:巧言令色,鮮矣仁贮匕。
自定義前言:
子曰:不憤不啟姐仅,不悱不發(fā)。舉一隅不以三隅反粗合,則不復(fù)也萍嬉。
題目:
給定一個(gè)整數(shù)數(shù)組 nums 和一個(gè)整數(shù)目標(biāo)值 target,請(qǐng)你在該數(shù)組中找出 和為目標(biāo)值 的那 兩個(gè) 整數(shù)隙疚,并返回它們的數(shù)組下標(biāo)壤追。
你可以假設(shè)每種輸入只會(huì)對(duì)應(yīng)一個(gè)答案。但是供屉,數(shù)組中同一個(gè)元素在答案里不能重復(fù)出現(xiàn)行冰。
你可以按任意順序返回答案溺蕉。
示例 1:
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因?yàn)?nums[0] + nums[1] == 9 ,返回 [0, 1] 悼做。
示例 2:
輸入:nums = [3,2,4], target = 6
輸出:[1,2]
示例 3:
輸入:nums = [3,3], target = 6
輸出:[0,1]
提示:
2 <= nums.length <= 103
-109 <= nums[i] <= 109
-109 <= target <= 109
只會(huì)存在一個(gè)有效答案
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/two-sum
分析:
拿到這個(gè)題目疯特,先分析,目標(biāo)是針對(duì)一個(gè)數(shù)組進(jìn)行操作肛走,數(shù)組漓雅,用[]表示,元素可重復(fù)朽色,元素類型可為數(shù)字邻吞、字符、對(duì)象葫男、數(shù)組(多維數(shù)組)抱冷、函數(shù);其本身就是一種特殊對(duì)象梢褐,用typeof()返回Object旺遮;.length(不過濾空位)屬性返回成員數(shù)量,可人為設(shè)置length值;運(yùn)算符in盈咳,適用于對(duì)象耿眉,也適用于數(shù)組,判斷是否存在猪贪;for...in(過濾空位)循環(huán)不僅可以遍歷對(duì)象跷敬,也可以遍歷數(shù)組,遍歷數(shù)組所有鍵,數(shù)組值的遍歷用for循環(huán)热押、while循環(huán)西傀、forEach(過濾空位);典型的“類似數(shù)組的對(duì)象”是函數(shù)的arguments對(duì)象,可以用slice方法將“類似數(shù)組的對(duì)象”變成真正的數(shù)組桶癣。
數(shù)組擴(kuò)展:擴(kuò)展運(yùn)算符(spread)是三個(gè)點(diǎn)(...)拥褂,將一個(gè)數(shù)組轉(zhuǎn)為用逗號(hào)分隔的參數(shù)序列,可替換apply方法牙寞,可復(fù)制數(shù)組(直接復(fù)制等于復(fù)制了指針饺鹃,依然可操作原數(shù)據(jù)),可合并數(shù)組间雀,可解構(gòu)賦值悔详,可將字符串轉(zhuǎn)為數(shù)組,實(shí)現(xiàn) Iterator 接口的對(duì)象(只要具有 Iterator 接口的對(duì)象惹挟,都可以使用擴(kuò)展運(yùn)算符)茄螃;可用Array.from方法將兩類對(duì)象(類似數(shù)組的對(duì)象(array-like object)和可遍歷(iterable)的對(duì)象)轉(zhuǎn)為真正的數(shù)組;Array.of()方法用于將一組值连锯,轉(zhuǎn)換為數(shù)組归苍;數(shù)組實(shí)例的copyWithin()方法用狱,在當(dāng)前數(shù)組內(nèi)部,將指定位置的成員復(fù)制到其他位置(會(huì)覆蓋原有成員)拼弃,然后返回當(dāng)前數(shù)組夏伊。也就是說,使用這個(gè)方法吻氧,會(huì)修改當(dāng)前數(shù)組溺忧;實(shí)例方法還有 find() 、findIndex()盯孙、fill()(填充)砸狞、entries()(遍歷鍵值對(duì))、keys() (遍歷鍵)镀梭、 values()(遍歷值)、includes()(判斷包含)踱启、flat()(拉平)报账,flatMap()(遍歷元素執(zhí)行函數(shù));ES2019 明確規(guī)定埠偿,Array.prototype.sort()的默認(rèn)排序算法必須穩(wěn)定透罢。復(fù)習(xí)了一下數(shù)組。
通過題意冠蒋,發(fā)現(xiàn)最后輸出的也是一個(gè)數(shù)組羽圃,期間要對(duì)數(shù)組進(jìn)行操作,而且是key - value 的鍵值對(duì)操作抖剿,所以想到用哈希結(jié)構(gòu)(映射)Map()朽寞。
Map()方法has(判斷是否存在)、set(賦值)斩郎、get(讀饶匀凇)、size屬性(返回 Map 結(jié)構(gòu)的成員總數(shù))缩宜、delete肘迎、clear;遍歷方法跟數(shù)組一樣entries()(遍歷鍵值對(duì))锻煌、keys() (遍歷鍵)妓布、 values()(遍歷值)、forEach宋梧。
接下來就是怎么實(shí)現(xiàn)的問題了匣沼,定義一個(gè)空Map(),遍歷數(shù)組乃秀,使用.length肛著,利用其不過濾空位的特性圆兵,因?yàn)閠arget+空=target,利用Map的has判斷target - nums[i]是否存在枢贿,如果不存在殉农,key - value交換位置放入Map,如果存在局荚,輸出兩個(gè)索引值超凳。
解答:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
//確保nums存在
if(!nums) return [];
//定義一個(gè)空Map
const map = new Map();
for (let i = 0; i < nums.length; i++) {
//將nums[i]---i形式的鍵值對(duì)放入map的同時(shí)進(jìn)行遍歷匹配
if (map.has(target - nums[i])) {
//只遍歷一次,也保證索引不重復(fù)
return [map.get(target - nums[i]), i]
}
map.set(nums[i], i)
}
return ;
};