【記錄帖】(No.003)從零打卡刷Leetcode

2021-02-21 小詹學Python

點擊上方「小詹學Python」,選擇「置頂公眾號」

資源乾貨第一時間送達!

寫在前邊:

小詹一直覺得自己編程能力不強,想在網上刷題,又怕不能堅持。不知道有木有和小夥伴和小詹一樣想找個人一起刷題呢?歡迎和小詹一起定期刷leetcode,每周一周五更新一題,每一題都吃透,歡迎一題多解,尋找最優解!歡迎小夥伴們把自己的思路在留言區分享出來噢

前期回顧:

【記錄帖】(No.002)從零打卡刷Leetcode

【記錄帖】(No.001)從零打卡刷Leetcode


上一期有留一個小bug讓小夥伴們找,不知道多少人自己找到了啊?愛學習的人肯定自己去嘗試了,肯定發現leetcode上運行結果發現輸出不是預期的[7, 0, 8],而是像下邊這樣:

Finished in 36 ms
[7, 0.6999999999999993, 8.07, 1]

一個不合預期的地方是出現了小數,還有一個則是鍊表長度不合預期。其實,這個是除法導致的,這裡的除法保留了小數部分,導致進位標誌carry不是我們需要的整型0或者1了,所以出現了小數,另一方面進位的錯誤也導致在最高位的時候再次進了一位,即鍊表中多出了個1。修改方法很簡單,只需要在兩處carry位置進行類型轉換,具體如下。或者注意''/''和「//」的區別,後者所除的結果僅保留商(整型),前者即存在小數。

carry = int(p.next.val / 10)

上期沒找出原因的小夥伴可以去改過來試試看噢~

No.3 Longest Substring without Repeating Characters  

原題:

Given a string, find the length of the longest substring without repeating characters.

題目大意:給出一個字符串,找到最長的沒有重複字符的子字符串,並返回該子字符串的長度。

例如:

Given "abcabcbb", the answer is "abc", which the length is 3.
Given "bbbbb", the answer is "b", with the length of 1.
Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

可能是前邊的題目都大同小異,難度也接近。也有可能是人的思維有慣性,小詹又是利用循環嵌套遍歷所有情況進行判斷的,這種簡單粗暴可以實現,但是效率很低。大體思路是:第一層循環從字符串的最左側到最右側第二個,即for i in range(0,len(s)-1),第二層循環則從第一層緊跟著的一個到最後一個字符。即for j in range(i+1,len(s));之後通過找出所有不重複的子字符串,比較長度得到最大長度的子字符串。代碼如下:(需要注意當字符串長度為0或1的特殊情況)

def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
max_len = 0

if (len(s) == 1 or len(s) == 0):
max_len = len(s)

for i in range(0,len(s)-1):
for j in range(i+1, len(s)):
if s[j] in s[i:j]:
if j-i > max_len:
right = j
left = i

max_len = right-left
break
elif j == len(s) - 1:
if max_len < j - i + 1:
max_len = j - i + 1
return max_len

結果當然是可以通過的啦,然而時間效率方面很差很差,如圖:

然而,我們不能滿足於這種最低效率的實現結果。下邊提出一個炒雞牛逼的方法,非原創,小詹花了很久才搞明白其思路,其利用到了字典的方法。什麼是字典?請自行補充知識噢(公眾號有語法綜述)。先放代碼後再解釋:

def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""

indexDict = {}

maxLength = currMax = 0
for i in range(len(s)):




if s[i] in indexDict and i - indexDict[s[i]] - 1 <= currMax:
if maxLength < currMax:
maxLength = currMax
currMax = i - indexDict[s[i]] - 1
currMax = currMax + 1
indexDict[s[i]] = i
return maxLength if currMax < maxLength else currMax

代碼裡對應位置加入了注釋,理解起來應該好很多了,這裡舉例說明下為什麼【i - indexDict[s[i]] - 1】代表了當前找到子字符串的長度。

比如字符串'abcdadd',代碼運行過程中一直迭代到i=3【對應字符d】時,都不滿足s[i] in indexDict ,不執行條件語句,而是currMax依次加一,並且將字符信息以{s[i]:i}的形式存放在字典中。當繼續迭代i=4時,進入條件語句,這裡主要解釋【i - indexDict[s[i]] - 1】,檢測到了重複字符'a',之前該字符出現位置為i=0處即【indexDict[s[i]] =0】這時候當前檢測到的無重複字符子串為'abcd',長度為【4-indexDict[s[i]] -1 = 3】。其他同此例。

Python系列之——在北京當房奴的日子~

爬蟲和反反爬蟲(下篇)

相關焦點

  • leetcode刷對了麼
    今天,逆行君就帶你從世界觀和方法論兩方面走進「leetcode」 leetcode之世界觀 什麼是leetcode 簡單來說,leetcode是一個美國的在線編程網站,它收集了各大公司的經典算法面試題,用戶可以選擇不同的語言進行代碼的在線編寫、編譯和調試。
  • 如何科學的刷 Leetcode
    這是它的官網,https://leetcode.com。Leetcode 官網很久以前,還是在大學的時候,有師兄對我意味深長的說,如果把 Leetcode 上面的題目做上七遍,就有很大概率能夠通過谷歌的面試。雖然有點誇張,這句話還是對我幼小的內心,產生了不小的震撼。
  • LeetCode刷題第三周【數組(簡單)】
    刷題前我們來了解一下什麼是數組:數組是在程序設計中,為了處理方便, 把具有相同類型的若干元素按有序的形式組織起來的一種形式。首先,數組會利用 索引 來記錄每個元素在數組中的位置,且在大多數程式語言中,索引是從 0 算起的。我們可以根據數組中的索引,快速訪問數組中的元素。事實上,這裡的索引其實就是內存地址。
  • 笨方法刷 leetcode(一)
    )本篇記錄5道題的解題思路,可能都是最笨的方法題目描述:實現一個算法,確定一個字符串 s 的所有字符是否全都不同示例 1:輸入: s = "leetcode"輸出: false示例 2:輸入: s = "abc"輸出: true限制:0 <= len(s) <= 100原題連結:https://leetcode-cn.com/problems/is-unique-lcci/解決思路:
  • leetcode刷題最強指南(版本1.0)
    為什麼會有這篇刷題指南很多剛開始刷題的同學都有一個困惑:面對leetcode上近兩千道題目,從何刷起
  • 003. 無重複字符的最長子串 | Leetcode題解
    關鍵點滑動窗口記錄當前 index 開始的最大的不重複的字符序列複雜度分析代碼JavaScript 實現/***  @作者:user7746o*  @連結:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution
  • 六十四、開始刷Leetcode之旅(Python版本)
    其實Leetcode上的一部分題我都基本刷過,那麼我就開始吧。註冊Leetcode帳號目前Leetcod有國際和中文的兩個版本,下圖就是我的中文版本,刷的不夠,其實我也挺菜的。這個是中文的網址:https://leetcode-cn.com/problemset/all/下圖就是我的國際版本,其實我主要在國際版混日子,刷了100多題,其實我很菜的。這是它的官網,https://leetcode.com。
  • 頂級程式設計師必刷寶典!LeetCode中文解題思路重磅問世!
    LeetCode簡介LeetCode收錄了許多網際網路公司的算法題目,被稱為刷題神器。資源內容第一個部分是 leetcode 經典題目的解析,包括思路,關鍵點和具體的代碼實現。第二部分是對於數據結構與算法的總結第三部分是 anki 卡片, 將 leetcode 題目按照一定的方式記錄在 anki 中,方便大家記憶。
  • 【Leetcode刷題練Python】1. 兩數之和
    Leetcode,這個大名鼎鼎的刷題神器,對於將要入行碼農行業或已是碼農的猿猿們來說,是必不可少的的練習工具。但可能還有很多小猿們還不知道它。
  • leetcode刷題指南之RussianDollEnvelopes
    j].second)15                dp[i]=max(dp[i],dp[j]+1);16    int ans=0;17    for(int i=0;i<n;i++)18        ans=max(ans,dp[i]);19    return ans;20}21};推薦閱讀:leetcode
  • leetcode刷題指南之PatchingArray
    +]; 9        else{10            ans++;11            sum += sum+1;12        }13    }14    return ans;15}16};作者:東大ACM退役隊伍編輯:劉凱旋推薦閱讀:leetcode
  • leetcode刷題指南之shortestPalindrome
    i+1;18        }19    }20    for (int i = len; i < n; i++) {21        s += h[i];22    }23    return s;24}25};作者:東大ACM退役隊伍編輯:劉凱旋推薦閱讀:leetcode
  • LeetCode按照怎樣的順序來刷題比較好?
    分享一下身邊大神的刷題順序:如果你時間比較緊迫,為了找工作而刷題,我建議你先刷熱門推薦,一共兩百多道題。先刷熱題 HOT 100,再刷精選 TOP 面試題,之後刷其他的題。如果你時間比較充裕,那我建議你:按從低到高的難度分組刷按 tag 分類刷定期複習,重做之前刷過的題掌握 LeetCode 刷題方法再開始刷題,屬於磨刀不誤砍柴工。
  • leetcode刷題指南之PalindromePairs
    = i)25                    ans.push_back({ma[r], i});26            }27        }28        return ans;29    }30};作者:東大ACM退役隊伍編輯:劉凱旋推薦閱讀:leetcode刷題指南之
  • 字節大佬Leetcode刷題筆記,看完吊打問你算法的面試官
    介紹leetcode 題解,記錄自己的 leetcode 解題之路。目前分為五個部分:第一個部分是 leetcode 經典題目的解析,包括思路,關鍵點和具體的代碼實現。第二部分是對於數據結構與算法的總結第三部分是 anki 卡片, 將 leetcode 題目按照一定的方式記錄在 anki 中,方便大家記憶。
  • 春節大禮包|刷題技巧+80道Leetcode
    為了跳槽,我前兩年的春節都是在刷題中度過的,目前為止刷了小四百道leetcode,也算是有一些經驗,今天就跟大家分享下學習方法和我總結的乾貨。後來發現了 Leetbook[1] 這個寶藏,才算是找到了適合自己的刷題方法。
  • 【SQL刷題系列】:leetcode180 Consecutive Numbers
    點擊上方 ↑ 藍色關注「Python數據科學」SQL刷題系列為此,Python數據科學開啟了SQL刷題的系列,希望可以幫助有需要的朋友們。題目來源:本篇內容為Leetcode上SQL題庫180難易程度:中等▌刷題回顧【SQL刷題系列】:leetcode178 Rank Scores【SQL刷題系列】:leetcode183
  • leetcode刷題指南之findtheduplicatenumber
    if (nums[i] <= m) cnt++;10        if (cnt > m) r = m;11        else l = m + 1;12    }13    return l;14}15};作者:東大ACM退役隊伍編輯:劉凱旋推薦閱讀:leetcode
  • Anki實戰-刷leetcode之「141-環形鍊表」
    有同學說自己刷leetcode的時候每次刷完就忘,忘了再刷。
  • leetcode 45. 跳躍遊戲--每天刷一道leetcode算法系列!
    leetcode 45. 跳躍遊戲--每天刷一道leetcode算法系列!(本篇)題目描述給定一個非負整數數組,你最初位於數組的第一個位置。數組中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達數組的最後一個位置。