又到了一年一度金三銀四找工作的時候了覆劈,最近自己的生活狀態(tài)可以總結(jié)兩點(diǎn):不是在面試就是在準(zhǔn)備面試保礼,甚是疲憊啊~~
在面試和準(zhǔn)備面試的過程中,遇到了幾道面試頻率很高的算法題责语,尤其是“兩數(shù)之和”這道題炮障,不僅在刷題的時候遇到了,在面試的時候坤候,也遇到了至少兩次胁赢,每次抱著僥幸的心理用雙for循環(huán)寫出來覺得很簡單,但是當(dāng)面試官問可否用單for循環(huán)的時候白筹,確實有點(diǎn)傻眼智末。所以事實證明,凡事不要抱著僥幸心理遍蟋,得過且過吹害,一定要深究到底。下面廢話少說虚青,和我一起“深究”起來吧它呀!
題目:
給定一個整數(shù)數(shù)組 `nums` 和一個目標(biāo)值 `target`,請你在該數(shù)組中找出和為目標(biāo)值的那 **兩個** 整數(shù),并返回他們的數(shù)組下標(biāo)纵穿。
你可以假設(shè)每種輸入只會對應(yīng)一個答案下隧。但是,數(shù)組中同一個元素不能使用兩遍谓媒。
**示例:**
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
方法一:
最簡單的算法就是利用雙for循環(huán)淆院,找到我們想要的結(jié)果以數(shù)組形式返回。相信這個方法大家都會句惯,就不多說了土辩,直接上代碼
function add(arr,target){
for(let i=0;i<arr.length;i++){
for(let j=i+1;j<arr.length;j++){
if(i!==j&&arr[i]+arr[j]===target){
return [i,j];
}
}
}
}
方法二:
利用哈希表的特點(diǎn),創(chuàng)建哈希表抢野,尋找對應(yīng)符合的值拷淘。這里可以想到對象是以hash結(jié)構(gòu)來存儲key,value的,所以我們可以創(chuàng)建對象指孤。通過key和value來查找我們想要的結(jié)果启涯,如果有就直接返回,如果沒有繼續(xù)設(shè)置“哈希表”恃轩。代碼如下:
function add(arr,target){
let map = new Map();
for(let i=0;i<arr.length;i++){
let n = target-arr[i];
if(map.has(n)){
return [map.get(n),i];
}
map.set(arr[i],i);
}
}
注解:new Map是es6新增的结洼,Map是鍵/值對的集合,這些鍵和值可以是任何數(shù)據(jù)類型叉跛。和普通對象的區(qū)別是它的key可以是任意類型松忍,而普通對象無法使用非字符串值作為鍵名,另外Map對象有set()/get()/has()等方法昧互,方便使用挽铁,更詳細(xì)的可以自行百度咯伟桅。
下面再奉上普通對象的代碼敞掘,思想一樣,只不過改了一下寫法而已:
function add(arr,target){
let map = {};
for(let i=0;i<arr.length;i++){
let n = target-arr[i];
if(n in map){
return [map[n],i];
}
map[arr[i]]=i;
}
}
好了楣铁,今天就寫到這里吧玖雁,希望能對大家有幫助~~