javascript - 下面的這段算法代碼求解釋
問題描述
就是關(guān)于這個算法的代碼,用javascript實現(xiàn)的,但是下面這個算法沒看懂。求大神解釋。
var twoSum = function(nums, target) { var ret = []; var exist = {}; for(var i = 0; i < nums.length; i++){if(typeof(exist[target - nums[i]]) !== ’undefined’){ ret.push(exist[target - nums[i]]); ret.push(i + 1);}exist[nums[i]] = i + 1; }return ret};
問題解答
回答1:題主可以試著用例子代入進去走讀一遍代碼。下面是我的見解:
比如就按截圖里的例子:
for循環(huán)里主要是遍歷第一個參數(shù)數(shù)組,然后它做的關(guān)鍵兩個步驟:
我們先看if后面那個, exist[nums[i]] = i + 1; 這句是每個循環(huán)都會執(zhí)行的,exist在這里是字典的意思,比如遍歷第一個數(shù)是2(i=0),于是exist就保存了:{2:1} 這樣的鍵值對,所以一遍循環(huán)下來,exist將會是:數(shù)組反過來,“元素值”:'數(shù)組索引+1'的鍵值對字典。
接下來,再去看if里面的判斷,當然for循環(huán)i=0時,exist還沒有注入鍵值對,if表達式為false
但到了i=1的時候 exist[target-nums[1]] 即exist[9-7] = exist[2], 這不就是剛才i=0的時候,就注入exist的第一個鍵值對么?于是乎,把對應(yīng)的鍵值對的值(其實就是原數(shù)值的在原來數(shù)組的索引+1)存檔ret去,接著又把當前的 i+1 也存到ret……最后循環(huán)走完,返回ret,于是得到了[1,2] ps:題主給的例子答案跟代碼的不一致。
總結(jié):這個算法核心就是利用的對象exist來存已遍歷過的數(shù)組元素,利用target-nums[i] 反過來間接通過exist來查找數(shù)組已遍歷過的元素是否存在符合條件的元素。
相關(guān)文章:
1. list - python 求助2. 請問寫好python模塊以后,文檔怎么寫?3. 后端開發(fā) - mysql按時間分段統(tǒng)計的sql語句怎么寫好?4. javascript - 原生JS和jQuety關(guān)于設(shè)置圖片輪播定時器問題5. c++ - 如何在python的阻塞的函數(shù)中獲取變量值6. 初來乍到,相對路徑問題,新手求教7. 哭遼 求大佬解答 控制器的join方法怎么轉(zhuǎn)模型方法8. 老師您好!我有一個問題、9. javascript - iframe 為什么加載網(wǎng)頁的時候滾動條這樣顯示?10. mysql - 在下剛?cè)腴Tsql 關(guān)于sql的語法詢問
