難度中等455
給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。
示例:
輸入:說明:思考這題思路其實是最簡單的,對每個單詞,用乙個長度26陣列,記錄每個字母個數,相同位置字母個數全相同,則歸為同一類,新增到map同乙個key的值陣列中。["eat", "tea", "tan", "ate", "nat", "bat"]
輸出:[["ate","eat","tea"],
["nat","tan"],
["bat"]
]
1.如何將a,b,c的個數儲存到陣列對應的位置?
2.如何將單詞儲存到map當中?
**實現
/**
* @param strs
* @return
*/var groupanagrams = function(strs)
const map =new map()
for (let str of strs)
const key = characters.join() //陣列要轉成字串才能用
if(map.has(key)) else
}const result =
for (let item of map)
return result
};
知識在寫**的時候,遇到幾個點,特別的細節,在這裡重點說一下。
1.arr.push()返回的是陣列的長度,而不是新陣列。
//最開始的版本,實際上是把陣列的長度當成了key的值傳進去了,顯然是不對的
if(map.has(key)) else
//改進後,map.get(key)獲取陣列,push之後,再將新的陣列傳入,但**有點亂
if(map.has(key)) else
//用temp儲存原先的陣列,push進入新的值後,temp再當做value傳入
if(map.has(key)) else
2.陣列轉化成字串,注意用什麼連線。一開始用的是const key = characters.join('''').這樣有什麼問題呢。先看個例子。
發現了什麼,用("")拼接是無縫的,也就是[1,0,1,0,10]和[1,0,10,1,0] 就被轉化成了同乙個字串
下面看測試用例
這會造成什麼結果?就是bdddddddddd和bbbbbbbbbbc的key會變成同乙個字串,從而歸為一類,真的是太壞了!!
而用join()無引數拼接後,中間就有逗號加以區別。
3.ascii碼可以將a,b,c...儲存到指定的位置,a的ascii碼是97,那麼a-97=0,正好對應陣列的第乙個下標。
4.遍歷map可以,for(item of map), 每個item是乙個陣列,item[0]是key, item[1]是value.
49 字母異位詞分組
給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。示例 輸入 eat tea tan ate nat bat 輸出 ate eat tea nat tan bat 說明 所有輸入均為小寫字母。不考慮答案輸出的順序。思路 這個題的思路非常清晰,遍歷字串陣列,對其中每乙個...
49 字母異位詞分組
arrays.sort排序的時間複雜度為o slogs 外面還有n次迴圈,總共為nslogs,s為字串的長度。空間複雜度為o ns hashmap儲存了每個字串 1 我對arraylist操作不熟,還有arrays.sort 得趕緊學習了 2 乙個字串會有原始字元,所以只要知道原始字元,原始字元下一...
49 字母異位詞分組
給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。示例 輸入 eat tea tan ate nat bat 輸出 ate eat tea nat tan bat 1.對每個子串排序生成乙個新的陣列,構造乙個字典d,遍歷新陣列往字典裡放 o nklogk o nk 2...