笨方法刷 leetcode(一)

2021-03-02 冰霜blog

最近在看leetcode,並且正在上面刷一些簡單級別的題目(不過說真的,這些題真的簡單嗎??或許是我太菜,有些感覺也很難)

本篇記錄5道題的解題思路,可能都是最笨的方法

題目描述

實現一個算法,確定一個字符串 s 的所有字符是否全都不同

示例 1:

輸入: s = "leetcode"

輸出: false

示例 2:

輸入: s = "abc"

輸出: true

限制:

0 <= len(s) <= 100

原題連結:

https://leetcode-cn.com/problems/is-unique-lcci/

解決思路:

python中有一個內置函數set(),它的一個特性就是->可以利用已有列表、字符串、元組或字典的內容來創建集合,其中重複的值會被丟棄;所以就可以通過set()來得到一個剔除重複值後的集合,並且比較兩者的長度,如果長度相等,則證明字符唯一;如果長度不等,則字符不唯一

代碼如下:

class Solution(object):
def isUnique(self, astr): """ :type astr: str :rtype: bool """ len_1 = len(astr) b = set(astr) len_2 = len(b) if len_1 == len_2: print("true") return True else: print("false") return False

題目描述

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,並返回他們的數組下標。  

你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。     

示例:  給定 nums = [2, 7, 11, 15], target = 9  因為 nums[0] + nums[1] = 2 + 7 = 9 

原題連結:

https://leetcode-cn.com/problems/two-sum/

解決思路:

用第1個數字依次與其後面的數字相加,判斷結果是否為目標值;然後用第2個數字依次與其後面數字相加,判斷結果是否為目標值;         依此類推,用第n個數,與其後的數字相加,這樣就做到了任意2個數字(不重複)的疊加求和

代碼如下:

class Solution(object):    def twoSum(self, nums, target):        """        思路:用第1個數字依次與其後面的數字相加,判斷結果是否為目標值;然後用第2個數字依次與其後面數字相加,判斷結果是否為目標值        依次類推,用第n個數,與其後的數字相加,這樣就做到了任意2個數字的不重複疊加求和        :type nums: List[int]        :type target: int        :rtype: List[int]        """        for i in range(0, len(nums)):              for j in range(i + 1, len(nums)):                  if nums[i] + nums[j] == target:                      return i, j                  else:                    continue  

題目描述

判斷一個整數是否是迴文數。

迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

示例 1:

輸入: 121

輸出: true

示例 2:

輸入: -121

輸出: false

解釋: 從左向右讀, 為 -121 。從右向左讀, 為 121- 。因此它不是一個迴文數。

示例 3:

輸入: 10

輸出: false

解釋: 從右向左讀, 為 01 。因此它不是一個迴文數。

進階:

你能不將整數轉為字符串來解決這個問題嗎?

原題連結:

https://leetcode-cn.com/problems/palindrome-number/

解決思路:

把輸入的數字先轉換成列表,反向取出來,也就是從最後一個開始提取,然後依次追加到一個新的列表並組合成一個新的字符串,

代碼如下:

class Solution(object):    def isPalindrome(self, x):        """        解決思路:把輸入字符串轉換成列表,反向取出來,也就是從最後一個開始提取,然後依次追加到一個新的列表並組合成一個新的字符串,然後與原字符串判斷是否相等        :type x: int        :rtype: bool        """
string = str(x) s_list = list(string) n_list = [] for t in range(0, len(s_list)): n_list.append(s_list[len(s_list)-t-1])
n_string = "".join(n_list)
if string == n_string: return True else: return False

另一種寫法更簡單些,把輸入數字轉換成字符串後,直接通過切片的方法,反向輸出得到一個新的字符串
def isPalindrome_2(self, x):    string = str(x)    new_string = string[::-1]
if string == new_string: return True else: return False

題目描述

給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍為 [−231,  231 − 1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0

原題連結:

https://leetcode-cn.com/problems/reverse-integer/

解決思路:

先把整數轉換為字符串,然後利用字符串切片的方法將其進行反轉(注意:如果傳入的是負數,需要保留"-"前綴,只將後面的字符反轉)

代碼如下:

class Solution(object):
def reverse(self, x): """
:type x: int :rtype: int """ l = str(x) if l[0] == "-": s = l[1:] new = s[::-1] i = "" for t in new: i += t i = "-" + i else: new = l[::-1]
i = "" for t in new: i += t
if -2 ** 31 <= int(i) <= 2 ** 31 - 1: return int(i) else: return 0

題目描述

輸入: ["flower","flow","flight"]輸入: ["dog","racecar","car"]

原題連結:

https://leetcode-cn.com/problems/longest-common-prefix/

解決思路:

這個把我難住了,後來看了官方題解,裡面有一個橫向掃描法和一個縱向掃描法,下面根據自己的理解來實現了一下

代碼如下:

橫向掃描法

class Solution(object):    def longestCommonPrefix(self, strs):        """        橫向掃描法        :type strs: List[str]        :rtype: str        """        if not strs:            return ""        else:            prefix = strs[0]              length = len(strs)  
for t in range(1, length): prefix = self.common_start(prefix, strs[t]) if not prefix: break return prefix
@staticmethod def common_start(str1, str2): """ 獲取2個字符的公共前綴 :param str1: :param str2: :return: """ length = min(len(str1), len(str2))
if length == 0: return ""
else: common = "" for i in range(0, length):
common += str1[i]
if str2.startswith(common): continue
else: return common[:-1] return common


縱向掃描法

class Solution(object):    @staticmethod    def longestCommonPrefix2(strs):        """        縱向掃描法        :param strs:        :return:        """        if not strs:              return ""
for i in range(0, len(strs[0])):
c = strs[0][i]
for j in range(1, len(strs)):
if i <= len(strs[j])-1:
if strs[j][i] == c:
pass else: print("第1個return") return strs[0][:i] else: print("第2個return") return strs[0][:i] print("第3個return") return strs[0]

喜歡記得來一個

相關焦點

  • 六十四、開始刷Leetcode之旅(Python版本)
    從大一寫Python文章,到現在其都有上百篇,現在到了六十四,我覺得這個時候應該去刷題了,其實很多學Python的都不是專科的,都是給培訓機構宣傳牛逼,其實在程式語言中,Python是最簡單,最沒有難度的程式語言。我在之後的文章都更新數據結構和Leetcode。都用Python解決的方法。
  • leetcode刷對了麼
    為什麼一定是leetcode Leetcode是注重算法的刷題工具,在考算法的筆試面試中,碰見原題的概率可算是非常大: @飛龍:面試向算法,感覺沒有比leetcode更合適的訓練方法了。短期刷用處也很大,如果你對代碼有感覺的話,一些巧妙的解法你看一眼就會忘不了。
  • leetcode刷題指南之PalindromePairs
    方法一:暴力枚舉(i, j),判斷words[i]+words[j]是否是回文串。時間複雜度為O(n^2*k)。方法二:將所有字符串逆序插入map。對於每個字符串s,枚舉分割點pos,滿足[pos ~ s.size()-1]是回文串,且[0 ~ pos-1]的逆串在map中存在。
  • LeetCode按照怎樣的順序來刷題比較好?
    如果你時間比較充裕,那我建議你:按從低到高的難度分組刷按 tag 分類刷定期複習,重做之前刷過的題掌握 LeetCode 刷題方法再開始刷題,屬於磨刀不誤砍柴工。刷題方法:第一遍:可以先思考,之後看參考答案刷,結合其他人的題解刷。思考、總結並掌握本題的類型,思考方式,最優題解。第二遍:先思考,回憶最優解法,並與之前自己寫過的解答作比對,總結問題和方法。
  • 如何科學的刷 Leetcode
    這是它的官網,https://leetcode.com。Leetcode 官網很久以前,還是在大學的時候,有師兄對我意味深長的說,如果把 Leetcode 上面的題目做上七遍,就有很大概率能夠通過谷歌的面試。雖然有點誇張,這句話還是對我幼小的內心,產生了不小的震撼。
  • LeetCode刷題第三周【數組(簡單)】
    日期Oct.28 - Nov.03 2020(每日一題)Ps:本周我們接著上一周繼續刷數組,難度依舊是簡單,題目不再按順序,而是隨機挑選,下周開始會加深難度。隨著學校的開課,我會將平時上課的內容和筆記也整理成MK的格式上傳。
  • leetcode刷題最強指南(版本1.0)
    為什麼會有這篇刷題指南很多剛開始刷題的同學都有一個困惑:面對leetcode上近兩千道題目,從何刷起
  • leetcode刷題指南之shortestPalindrome
    現在,我們已經抽象出了問題,顯然解決這個問題最好的方法就是哈希,可以從s的末尾和h的首部通過不斷地添加字母來更新哈希值。每當更新完發現了相等的兩個哈希值,就說明此時s的後綴等於h的前綴,便可以更新答案。最終的複雜度是O(n)。
  • leetcode真的有1000道?別亂刷!掌握科學方法,省時高效不脫髮!
    很多人脫口而出,是刷題!毫無疑問,刷題是找工作的必經之路。但不懂方法的盲目刷題,僅僅只是一種「感動自己」但是卻毫無用處的安慰劑而已。年輕的時候,有前輩對我語重心長地說,如果把 Leetcode上面的題目做上五遍以上,離拿Google面試就不遠了。
  • Anki實戰-刷leetcode之「141-環形鍊表」
    有同學說自己刷leetcode的時候每次刷完就忘,忘了再刷。
  • 【記錄帖】(No.003)從零打卡刷Leetcode
    寫在前邊:小詹一直覺得自己編程能力不強,想在網上刷題,又怕不能堅持。不知道有木有和小夥伴和小詹一樣想找個人一起刷題呢?歡迎和小詹一起定期刷leetcode,每周一周五更新一題,每一題都吃透,歡迎一題多解,尋找最優解!
  • leetcode刷題指南之findtheduplicatenumber
    給出一個長度為n+1的數組,其中每個數字的範圍是[1,n],其中只有一個重複的數,現在要求找出這個重複的數,並且滿足以下條件:不能改動原始數組除了原始數組,只能另外開闢O(1)的空間算法複雜度一定要小於O(n^2)重複的那個數可能重複不止一次初看這題可能有很多種方式,但是幾個限制條件一加
  • leetcode 刷500道題,筆試/面試穩嗎?
    如果我在 leetcode 堅持刷它個 500 道題,以後筆試/面試穩嗎?這裡我說下我的個人看法,我認為不穩。下面說說為啥不穩以及算法題應該如何刷、如何學才比較好,當然,也會推薦自己學過的資料。一、先說說筆試題在刷 leetcode 的時候,你會發現,每道題的題意都很短,你只需要花十幾秒的時間,就知道這道題是要你幹嘛了,並且每道題所用道的算法思想都很明確,動態規劃、遞歸、二分查找等,你可能很快就知道該用哪種方法,只是你不懂如何把代碼寫出來而已。
  • 【每日一題】leetcode刷題指南之Longest Consecutive Sequence
    used.end())    {        used[right]=true;        right++;    }    ans=max(ans,right-left-1);}return ans;}作者:東大ACM退役隊伍編輯:劉凱旋推薦閱讀: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刷題練Python】1. 兩數之和
    從今天起,我將寫一個【Leetcode的刷題練Python】的系列,和大家一起用Python來解Leetcode的上面的算法題目。Leetcode是什麼?它是一個美國的在線編程網站。官方網址是:http://leetcode.com/,打開瀏覽器輸入網址,就可以在線寫代碼、提交、查看算法的優略以及個人別實現算法的對比等等。
  • 【SQL刷題系列】:leetcode180 Consecutive Numbers
    點擊上方 ↑ 藍色關注「Python數據科學」SQL刷題系列所以,不論大家是轉行還是學習都少不了這一關。為此,Python數據科學開啟了SQL刷題的系列,希望可以幫助有需要的朋友們。題目來源:本篇內容為Leetcode上SQL題庫180難易程度:中等▌刷題回顧【SQL刷題系列】:leetcode178 Rank Scores【SQL刷題系列】:leetcode183
  • 春節大禮包|刷題技巧+80道Leetcode
    為了跳槽,我前兩年的春節都是在刷題中度過的,目前為止刷了小四百道leetcode,也算是有一些經驗,今天就跟大家分享下學習方法和我總結的乾貨。後來發現了 Leetbook[1] 這個寶藏,才算是找到了適合自己的刷題方法。
  • 帶你狂刷算法Leetcode題!短時間內快速獲得實戰能力!
    但對於初學者來說,很容易沉迷在刷題的數量中,覺得如果能刷完這1000道題,自己一定能夠有所飛躍。但實際上,低效率的重複對你來說,根本就無法掌握到解題的精髓,一旦題目有所變動,就無法舉一反三。那究竟應該怎麼刷題才高效呢?