leetcode

88、找不同

給定兩個字符串 s 和 t,它們只包含小寫字母。

字符串 t 由字符串 s 隨機重排,然後在隨機位置添加一個字母。

請找出在 t 中被添加的字母。

示例:

輸入:

s = "abcd"

t = "abcde"

輸出:

e

解釋:

'e' 是那個被添加的字母。

代碼:

class Solution:
    def findTheDifference(self, s: str, t: str) -> str:
        s_list = sorted(list(s))
        t_list = sorted(list(t))
        for i in range(len(t_list)):
            if len(s_list) == i:
                return t_list[i]
            elif t_list[i] != s_list[i]:
                return t_list[i]

89、字符串中的第一個唯一字符

給定一個字符串,找到它的第一個不重複的字符,並返回它的索引。如果不存在,則返回 -1。

案例:

s = "leetcode"

返回 0.

s = "loveleetcode",

返回 2.

代碼:

class Solution:
    def firstUniqChar(self, s: str) -> int:
        import collections
        dicr_1 = collections.OrderedDict()
        for i in range(len(s)):
            if s[i] not in dicr_1:
                dicr_1[s[i]] = 1
            else:
                dicr_1[s[i]] += 1
        for key in dicr_1:
            if dicr_1[key] == 1:
                return s.index(key)
        return -1

90、缺失數字

給定一個包含 0, 1, 2, ..., n 中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數。

示例 1:

輸入: [3,0,1]

輸出: 2

示例 2:

輸入: [9,6,4,2,3,5,7,0,1]

輸出: 8

代碼:

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        nums = sorted(nums)
        for i in range(len(nums)):
            if i != nums[i]:
                return i
        return len(nums)

91、醜數

編寫一個程序判斷給定的數是否爲醜數。

醜數就是隻包含質因數 2, 3, 5 的正整數。

示例 1:

輸入: 6

輸出: true

解釋: 6 = 2 × 3

示例 2:

輸入: 8

輸出: true

解釋: 8 = 2 × 2 × 2

示例 3:

輸入: 14

輸出: false

解釋: 14 不是醜數,因爲它包含了另外一個質因數 7。

說明:

1 是醜數。

輸入不會超過 32 位有符號整數的範圍: [−231,  231 − 1]。

代碼:

class Solution:
    def isUgly(self, num: int) -> bool:
        if num == 1:
            return True
        if num <= 0:
            return False
        while num != 1:
            if num %2 == 0:
                num = num//2
            elif num%3 == 0:
                num = num//3
            elif num%5==0:
                num = num//5
            else:
                return False
        return True
            

92、有效的字母異位詞

給定兩個字符串 s 和 t ,編寫一個函數來判斷 t 是否是 s 的字母異位詞。

示例 1:

輸入: s = "anagram", t = "nagaram"

輸出: true

示例 2:

輸入: s = "rat", t = "car"

輸出: false

說明:

你可以假設字符串只包含小寫字母。

進階:

如果輸入字符串包含 unicode 字符怎麼辦?你能否調整你的解法來應對這種情況?

解題思路:

字母異位詞是指由相同的字母按照不同的順序組成的單詞,根據此含義,那麼這兩個單詞的長度也一定相等,所以我們就可以先將兩個單詞按照字母的大小進行排序,然後比較兩個單詞對應位置上的字母是否相等

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        s_list = sorted(list(s))
        t_list = sorted(list(t))
        if s_list == t_list:
            return True
        else:
            return False

93、2的冪

給定一個整數,編寫一個函數來判斷它是否是 2 的冪次方。

示例 1:

輸入: 1

輸出: true

解釋: 20 = 1

示例 2:

輸入: 16

輸出: true

解釋: 24 = 16

示例 3:

輸入: 218

輸出: false

 

class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        if n <= 0:
            return False
        if n == 1:
            return True
        elif str(n)[-1] not in ['2','4','6','8']:
            return False
        else:
            while n > 1:
                if n%2 == 0:
                    n //=2
                else:
                    return False
            return True

94、計數質數

統計所有小於非負整數 n 的質數的數量。

示例:

輸入: 10 輸出: 4 解釋: 小於 10 的質數一共有 4 個, 它們是 2, 3, 5, 7 。

# 代碼:
class Solution:
    def countPrimes(self, n: int) -> int:
        if n == 1 or n == 0 or n== 2:
            return 0
        list1 = list(range(1,n))
        list1[0] = 0
        for i in range(2,n):
            if list1[i-1] != 0:
                for j in range(i*2,n,i):
                    list1[j-1] = 0
        return len(list1)-list1.count(0)
# 思路:
# 厄拉多賽篩法

95、打家劫舍

你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。

示例 1:

輸入: [1,2,3,1]

輸出: 4

解釋: 偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。

  偷竊到的最高金額 = 1 + 3 = 4 。

示例 2:

輸入: [2,7,9,3,1]

輸出: 12

解釋: 偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接着偷竊 5 號房屋 (金額 = 1)。

  偷竊到的最高金額 = 2 + 9 + 1 = 12 。

 

# 代碼:
class Solution:
    def rob(self, nums: List[int]) -> int:
        n1,n2 = 0,0
        for each in nums:
            n2,n1 = max(n1+each,n2),n2
        return n2

# 解題思路:
# 這是一個動態規劃問題

96、錯誤的集合

集合 S 包含從1到 n 的整數。不幸的是,因爲數據錯誤,導致集合裏面某一個元素複製了成了集合裏面的另外一個元素的值,導致集合丟失了一個整數並且有一個元素重複。

給定一個數組 nums 代表了集合 S 發生錯誤後的結果。你的任務是首先尋找到重複出現的整數,再找到丟失的整數,將它們以數組的形式返回。

示例 1:

輸入: nums = [1,2,2,4]

輸出: [2,3]

注意:

給定數組的長度範圍是 [2, 10000]。

給定的數組是無序的。

class Solution:
    def findErrorNums(self, nums: List[int]) -> List[int]:
        cuowu = sum(nums)-sum(set(nums))
        linshi = range(1,len(nums)+1)
        zhengque = sum(linshi)-sum(set(nums))
        return [cuowu,zhengque]

97、旋轉數組

給定一個數組,將數組中的元素向右移動 k 個位置,其中 k 是非負數。

示例 1:

輸入: [1,2,3,4,5,6,7] 和 k = 3

輸出: [5,6,7,1,2,3,4]

解釋:

向右旋轉 1 步: [7,1,2,3,4,5,6]

向右旋轉 2 步: [6,7,1,2,3,4,5]

向右旋轉 3 步: [5,6,7,1,2,3,4]

示例 2:

輸入: [-1,-100,3,99] 和 k = 2

輸出: [3,99,-1,-100]

解釋:

向右旋轉 1 步: [99,-1,-100,3]

向右旋轉 2 步: [3,99,-1,-100]

說明:

儘可能想出更多的解決方案,至少有三種不同的方法可以解決這個問題。

要求使用空間複雜度爲 O(1) 的 原地 算法。

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        for i in range(k):
            x = nums.pop()
            nums.insert(0,x)

98、排列硬幣

你總共有 n 枚硬幣,你需要將它們擺成一個階梯形狀,第 k 行就必須正好有 k 枚硬幣。

給定一個數字 n,找出可形成完整階梯行的總行數。

n 是一個非負整數,並且在32位有符號整型的範圍內。

示例 1:

n = 5

硬幣可排列成以下幾行:

¤

¤ ¤

¤ ¤

因爲第三行不完整,所以返回2.

示例 2:

n = 8

硬幣可排列成以下幾行:

¤

¤ ¤

¤ ¤ ¤

¤ ¤

因爲第四行不完整,所以返回3.

from math import sqrt, floor
class Solution:
    def arrangeCoins(self, n: int) -> int:
        return floor(sqrt(1/4+2*n)-1/2)

99、快樂數

編寫一個算法來判斷一個數是不是“快樂數”。

一個“快樂數”定義爲:對於一個正整數,每一次將該數替換爲它每個位置上的數字的平方和,然後重複這個過程直到這個數變爲 1,也可能是無限循環但始終變不到 1。如果可以變爲 1,那麼這個數就是快樂數。

示例: 

輸入: 19
輸出: true
解釋: 
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

class Solution:
    def isHappy(self, n: int) -> bool:
        list1 = []
        while n!= 1:
            n = sum([int(i)**2 for i in str(n)])
            if n not in list1:
                list1.append(n)
            else:
                return False
        return True

100、同構字符串

給定兩個字符串 s 和 t,判斷它們是否是同構的。

如果 s 中的字符可以被替換得到 t ,那麼這兩個字符串是同構的。

所有出現的字符都必須用另一個字符替換,同時保留字符的順序。兩個字符不能映射到同一個字符上,但字符可以映射自己本身。

示例 1:

輸入: s = "egg", t = "add"
輸出: true
示例 2:

輸入: s = "foo", t = "bar"
輸出: false
示例 3:

輸入: s = "paper", t = "title"
輸出: true
說明:
你可以假設 s 和 t 具有相同的長度。

class Solution:
    def isIsomorphic(self, s: str, t: str) -> bool:
        dict1 = {}
        list1 = []
        for i in range(len(t)):
            if s[i] not in dict1:
                if t[i]not in list1:
                    dict1[s[i]] = t[i]
                    list1.append(t[i])
                else:
                    return False
            else:
                if dict1[s[i]] != t[i]:
                    return False
        return True

不斷在更新,希望也喜歡算法的你一起努力

發佈了94 篇原創文章 · 獲贊 109 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章