付費限定

389. Find the Difference (找不同)

更新於 發佈於 閱讀時間約 3 分鐘


英文版點我中文版點我


↑看個小廣告,支持好內容↑


我們這樣來讀題目:今天班級裡突然闖進一個陌生人,你拿著兩張相片,分別代表正常和「混入陌生人」的狀況,該如何在最快時間內抓出他呢?

威利在哪裡!我們就從有多一個人的照片著手,每看到人就去另一張照片檢查他有沒有出現。這樣確實能找出混進來的人,可是每個人都要重找一次照片,這太花時間了,有沒有比 O(n^2) 更好的做法?


❶ Sorting

老師於是叫大家照座號排成一列,看看會發生什麼:

s="dabe" -> 排列得到 "abde"
t="beacd" -> 排列得到 "abcde"


前兩項都相同,但由於第三項混入了 c,導致往後的項次都沒對上。從中可發現長字串裡,排序後第一個匹配不到的字母,必然是多出來的那個!

最起碼這避免了土法煉鋼,但排列仍需 O(nlogn),通常不會是最佳解。


❷ Hash Table (索引、桶子)

一般為了避免重找,直觀方式就是做個索引表,把看過的資料記錄下來。這通常也是大家的直覺做法:

1. 對 s 出現之字母累加正數
: map["a"]=1, map["n"]=2 代表字母 a,n 出現 1,2

2. 將 t 出現的字母逐一扣除,會出現以下狀況:
1) 索引 key 不存在:代表該字母在 s 未出現過
2) 扣​完出現負數:代表該字母在 t 出現次數比 s 多


兩種狀況都表示有找到多餘的字母!這個解法只要遍歷 s,t 字串各一次,複雜度因而降至線性 O(n)


話說回來,英文字母也才 26 種,開個長度 26 的陣列 (我習慣稱它桶子) 來計數也可以吧?實際上「桶子」和索引是很類似的概念,差別在於索引並不預知總共的類別 (key) 數量,桶子則一開始就定義 26 類並都填上了初始值 0。


❸ Sum

索引很安全穩固,但這題還有其他可愛的方法,記得上篇教過的 ASCII 嗎?假設

  • T = Σ (t 所有字母的 ASCII 值)
  • S = Σ (s 所有字母的 ASCII 值)

最後再反查 T-S 代表哪個字母,一樣可用 O(n) 優雅得出所求。


❹ XOR

位運算的掌握,很有可能替面試畫上點睛之筆!

raw-image

有沒有找到規律?當 x,y 相同時運算結果即為 0,換言之,它能將重複出現的元素成對抵銷,留下落單也就是混入的字母:

// s="dabe", t="beacd"

(d XOR a XOR b​ XOR e) XOR (b XOR e XOR a XOR c XOR d)
= (d XOR d) XOR (a XOR a) XOR (b XOR b) XOR (e XOR e) XOR c
= 0 XOR 0 XOR 0 XOR 0 XOR c
= c



篇幅不長也易懂的題目,解法居然出奇多種,試著動手一一實作它們,這是一道蘊含許多演算精華的超值經典:)


  • 本題分類標籤:Hash TableStringBit ManipulationSorting
  • 本題正解率=60.4%

❤️ 若內容對你實用,歡迎追蹤本專題,或小額贊助支持~
⭐ 這是我的第 4 篇刷題筆記,完整解題索引看這裡 → Here

以行動支持創作者!付費即可解鎖
本篇內容共 1349 字、0 則留言,僅發佈於哩哩叩叩平安符:LeetCode 刷題筆記你目前無法檢視以下內容,可能因為尚未登入,或沒有該房間的查看權限。
avatar-img
54會員
59內容數
我要成為 LeetCode 王!快跟我一起踏上旅程!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
LeetCode King 的其他內容
文字處理 101!把輸入內容做小寫轉換是很常見的應用唷~
動一步要花錢,動兩步卻免費,這其中藏了什麼詐?聰明的你想到了嗎?
環狀的公車路線圖,題目讀懂後會發現是個腦筋急轉彎!XD
文字處理 101!把輸入內容做小寫轉換是很常見的應用唷~
動一步要花錢,動兩步卻免費,這其中藏了什麼詐?聰明的你想到了嗎?
環狀的公車路線圖,題目讀懂後會發現是個腦筋急轉彎!XD
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
題目敘述 Kth Distinct String in an Array 給定一個輸入陣列arr 和 參數k 請返回第k個出現恰好一次的陣列元素。
Thumbnail
給定一個字串陣列,請把它們所共有的字元伴隨著出現次數輸出。這篇文章介紹如何使用字典統計出現次數,和字典取交集的方法來解決此問題。並提供了複雜度分析和關鍵知識點。
Thumbnail
給定一個輸入非負整樹陣列nums,請找出k值,使得陣列中恰好有k個元素大於等於 k。如果無解,回傳-1。尋找k值的方法包括排序法和二分搜尋法,時間複雜度都為O(n log n),空間複雜度為O(1)。關鍵知識點是當解空間具有遞增或遞減的性質時,可以用二分搜尋法加快搜尋效率。
Thumbnail
題目敘述 題目會給定我們兩個字串。 第一個是指定順序的字串order。 第二個是輸入字串s。 要求我們依據order給定的順序,重新排列s。 如果出現order中沒有出現的字母,任意位置皆可。 合法答案可能不只一組,輸出其中一種即可。 題目的原文敘述 測試範例 Example
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目會給我們兩個輸入,字串s和字串t,要求我們判定s是否為t的子序列(Subsequence)? 題目的原文敘述 測試範例 Example 1: Input: s = "abc", t = "ahbgdc" Output: true Example 2: Input:
Thumbnail
題目敘述 題目會給定一個整數陣列nums,原本裡面包含有整數1到n,但是中間不小心出了差錯,導致有一個數字消失了,而另一個數字重複了。 請找出重複的數字以及消失的數字,並且 以陣列的形式[重複的數字, 消失的數字]返回這兩個數字。 例如: [1,3,3,4] 消失的數字是2,重複的數字是
Thumbnail
題目敘述 題目會給定一個整數陣列arr,要求我們判斷是否每個元素的出現次數都不同? 題目的原文敘述 測試範例 Example 1: Input: arr = [1,2,2,1,1,3] Output: true Explanation: The value 1 has 3 occurre
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
題目敘述 題目會給我們兩個字串作為輸入,分別是字串s和字串t,問我最少要做幾次字元轉換,讓字串t和字串s成為Anagram"同字母異序詞"? 註: 例如 god 和 dog 就是 Anagram 同字母異序詞,也是就說,組成字母相同,但是順序可以重新排列。 題目的原文敘述 測試範例 Ex
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
題目敘述 Kth Distinct String in an Array 給定一個輸入陣列arr 和 參數k 請返回第k個出現恰好一次的陣列元素。
Thumbnail
給定一個字串陣列,請把它們所共有的字元伴隨著出現次數輸出。這篇文章介紹如何使用字典統計出現次數,和字典取交集的方法來解決此問題。並提供了複雜度分析和關鍵知識點。
Thumbnail
給定一個輸入非負整樹陣列nums,請找出k值,使得陣列中恰好有k個元素大於等於 k。如果無解,回傳-1。尋找k值的方法包括排序法和二分搜尋法,時間複雜度都為O(n log n),空間複雜度為O(1)。關鍵知識點是當解空間具有遞增或遞減的性質時,可以用二分搜尋法加快搜尋效率。
Thumbnail
題目敘述 題目會給定我們兩個字串。 第一個是指定順序的字串order。 第二個是輸入字串s。 要求我們依據order給定的順序,重新排列s。 如果出現order中沒有出現的字母,任意位置皆可。 合法答案可能不只一組,輸出其中一種即可。 題目的原文敘述 測試範例 Example
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目會給我們兩個輸入,字串s和字串t,要求我們判定s是否為t的子序列(Subsequence)? 題目的原文敘述 測試範例 Example 1: Input: s = "abc", t = "ahbgdc" Output: true Example 2: Input:
Thumbnail
題目敘述 題目會給定一個整數陣列nums,原本裡面包含有整數1到n,但是中間不小心出了差錯,導致有一個數字消失了,而另一個數字重複了。 請找出重複的數字以及消失的數字,並且 以陣列的形式[重複的數字, 消失的數字]返回這兩個數字。 例如: [1,3,3,4] 消失的數字是2,重複的數字是
Thumbnail
題目敘述 題目會給定一個整數陣列arr,要求我們判斷是否每個元素的出現次數都不同? 題目的原文敘述 測試範例 Example 1: Input: arr = [1,2,2,1,1,3] Output: true Explanation: The value 1 has 3 occurre
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
題目敘述 題目會給我們兩個字串作為輸入,分別是字串s和字串t,問我最少要做幾次字元轉換,讓字串t和字串s成為Anagram"同字母異序詞"? 註: 例如 god 和 dog 就是 Anagram 同字母異序詞,也是就說,組成字母相同,但是順序可以重新排列。 題目的原文敘述 測試範例 Ex