leetCode EASY - Q217.Contains Duplicate - === ![](https://s2.51cto.com/images/blog/202108/03/d41ce0d2323853fe7d9868daf22eac2f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/format,webp) --- ###### tags: `leetCode`, `練習刷題`, <br> ## 題目 Given an integer array "nums", return *true* if any value appears at least twice in the array, and return *false* if every element is distinct. ![image](https://hackmd.io/_uploads/HkhPnpExA.png) ## 理解 這裡需要使用 nums 這個 props,然後type 是 number[] 的格式,當裡面有任何數字是一樣的話,就回傳為 *true*, 如果都不一樣就回傳 *false*. 我們可以理解為我們需要做一個檢查在陣列裡面的每一個數字是否含重複的元素。 在拿到結果之前,我們需要先解析array裡的每一個數字然後逐個做對比,這時候我們會想到 for。 ## 解法 ``` const containDuplicate = (nums:number[]) =>{ const hash = {}; for(let i= 0 ; i < nums.length ; i++){ if(typeof hash[nums[i]] === "number"){ return true; } hash[nums[i]] = nums[i]; } return false; } ``` 1. 首先,我們創建一個空的值叫 *hash* ,用於儲存陣列中每個經過閱讀的元素。 2. 然後,透過 *for* 循環遍歷陣列中的每個元素 3. 在每次循環中,先檢查當前的元素 *nums[i]* 是否已經作為一個key存在於 *hash* 這個對象裡面。這是通過檢查 *hash[nums[i]]* 的類型是否為 number 來實現的(這裡的假設是陣列中只包含數字。)如果是,表示當前元素之前已經遇到過,即陣列中存在重覆的元素,函數回傳 *true*。 4. 如果當前元素之前沒有遇到過,則將它加入到 *hash* 對象裡,key 和 value 都設為 *nums[i]* 5. 如果循環結束都沒有找到重複元素,則函數返回 *false*。 ## 為什麼是 typeof number? 這裡的目的是查找是否已經有相同的數字存在於 哈希表 中。子啊第一次遇到每個數字時,你會將其添加到哈希表中。這樣 *hash[nums[i]]* 的值會被設定為該數字或者其他一個標記(在上面的例子是設定為數字本身)。這個過程中 `typeof hash[nums[i]]` 的檢查是用來確認這個數字之前是否被加入過哈希表。 1. 在第一次遇到 nums[0] 時(例如 1),由於 hash[1] 還沒有被設置,所以 hash[nums[0]](即 hash[1])是 undefined,typeof hash[1] 會是 "undefined",不會觸發 true 條件。 2. 接著,你將 hash[1] 設置為某個值(本例中是 1),這樣當你下次遇到 1 時,hash[1] 已經存在且為 "number" 類型,此時 typeof hash[1] === "number" 就會評估為 true,表示你找到了一個重複的值。 --- ## 我的解法 ``` const containsDuplicate = (nums:number[]) =>{ const newNums = new Set(nums); return newNums.size !== nums.length; } ``` 沒錯,就4行寫完了。 ### Set() *Set* 是JS中一個內建物件,它允許你儲存任何類型的唯一值。無論是原始值或是物件參考。 *Set*對象是一組不重複的值,所以當你將多個相同的值加入到一個 *Set* 中時,它只會保留一個該值,這使得 *Set* 成為檢查重複元素的一個非常有效的方法。 1. new Set([iterable]): 創建一個新的 `Set` item。你可以選擇性地傳遞一個可迭代對象(如一個陣列)給 *Set* 的構造器, *Set*會從這個迭代對象抽取其元素,添加到新的*Set*中。 2. .add(value): 向 *Set* 中添加一個值。如果該值已存在,則不會進行任何操作。 3. .delete(value): 從*Set* 中移除指定的值 4. .has(value): 返回一個 boolean,表示 *Set* 中是否存在指定的值 5. .clear(): 移除*Set*中的所有元素 ### .size() *Set* 裡面並沒有 *.size()*這個方法喔,卻有一個 *.size* 的屬性,它返回 *Set* 中元素的數量。這是因為 *Set* 不是基於索引的,所以你不能像在陣列中那樣使用索引來訪問元素。 *size* 屬性讓你可以很容易獲取到 *Set* 中的元素數量,而不需要手動計算。 ``` const mySet = new Set(); mySet.add(1); mySet.add(5); mySet.add(5); // 重複的值不會被加入 mySet.add('some text'); const o = {a: 1, b: 2}; mySet.add(o); console.log(mySet.size); // 4,因為有四個唯一的值被加入到了 Set 中 ``` 這裡的 mySet 包含了4個唯一的元素:數字 1,數字 5, 字串 some text, 以及物件 o 。嘗試再次加入數字 5 時不會有任何效果,因為它已經存在於集合中了。