菜鳥的LeetCode之旅(易篇)

能看這篇文章的朋友,確定是對算法(找工做漲工資)感興趣的。python

1.兩數之和

LeetCode題源git

GitHub示例github

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
""" @File : 0001_兩數之和_易.py @Time : 2019/10/18 14:55 @Author : Crisimple @Github : https://crisimple.github.io/ @Contact : Crisimple@foxmail.com @License : (C)Copyright 2017-2019, Micro-Circle @Desc : """
""" ------------------------------------------------------------------------------------------ 給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。 你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。 示例: 給定 nums = [2, 7, 11, 15], target = 9 由於 nums[0] + nums[1] = 2 + 7 = 9,因此返回 [0, 1] 來源:力扣(LeetCode) 連接:https://leetcode-cn.com/problems/two-sum 著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。 ------------------------------------------------------------------------------------------- """

from typing import List


""" 思路一: (1)從數組nums中列舉元素, 並定義一個空字典; (2)用目標值target去減列舉的元素, 若是它們的差在字典中,則返回它們的下標; (3)若是它們的差不在字典中, 則把該值賦值給空字典, 直到找到符合的值, 不然返回None。 時間複雜度: O(n) """
class Solution1:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        """ :param nums: 整數數組: nums: List[int] :param target: 目標值: target: int :return: 返回值: List[int] """
        hashmap = {}
        for index, num in enumerate(nums):
            another_num = target - num
            if another_num in hashmap:
                return [hashmap[another_num], index]
            hashmap[num] = index
        return None


if __name__ == "__main__":
    nums1 = [1, 2, 3, 4, 5, 6]
    target1 = 9
    s1 = Solution1()
    print(s1.twoSum(nums=nums1, target=target1))
複製代碼

7.兩數之和

LeetCode題源算法

GitHub示例數組

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
""" @File : 0007_整數反轉_易.py @Time : 2019/10/29 10:20 @Author : Crisimple @Github : https://crisimple.github.io/ @Contact : Crisimple@foxmail.com @License : (C)Copyright 2017-2019, Micro-Circle @Desc : None """
""" 給出一個 32 位的有符號整數,你須要將這個整數中每位上的數字進行反轉。 示例 1: 輸入: 123 輸出: 321 示例 2: 輸入: -123 輸出: -321 示例 3: 輸入: 120 輸出: 21 注意: 假設咱們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231,  231 − 1]。請根據這個假設,若是反轉後整數溢出那麼就返回 0。 來源:力扣(LeetCode) 連接:https://leetcode-cn.com/problems/reverse-integer 著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。 """

""" 思路一: (1)將整數取餘操做並存入列表進行反轉; (2)將反轉後的列表進行累加輸出; (3)區分大於0和小於0的狀況 (4)考慮數字範圍及反轉後溢出的問題 時間複雜度: O(n**2) """
class Solution1:
    def reverse(self, x: int) -> int:
        """ @param x: 要被反轉的整數 @return: 返回的反轉後的整數 """
        arr = []
        a = 0
        if x > 0:
            for i in range(len(str(x))):
                arr.insert(i, (x // 10**i % 10))

            rra = list(reversed(arr))
            k = 1
            for j in range(len(rra)):
                a = rra[j]*(10**j) + a
                k = k + 1
            if -2**31 < a < 2**31-1:
                return a
            else:
                return 0
        elif x < 0:
            x = -x
            for i in range(len(str(x))):
                arr.insert(i, (x // 10**i % 10))

            rra = list(reversed(arr))
            k = 1
            for j in range(len(rra)):
                a = rra[j]*(10**j) + a
                k = k + 1
            if -2**31 < a < 2**31-1:
                return -a
            else:
                return 0
        else:
            return 0


""" 思路二:(1)將整數轉換爲字符串, 將字符串進行反轉操做; (2)將反轉後的字符串轉換爲整數; (3)轉換後的整數考慮大於0小於0及0的狀況; (4)考慮數字範圍及反轉後溢出的問題 時間複雜度: O(n) """
class Solution2:
    def reverse(self, x: int) -> int:
        pass

if __name__ == "__main__":
    """ 測試用例一 """
    x1 = -4567
    s1 = Solution1()
    print(s1.reverse(x=x1))

    """ 測試用例二 """
    
複製代碼

9.迴文數

LeetCode題源網絡

GitHub示例函數

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
""" @File : 0009_迴文數_易.py @Time : 2019/10/30 11:47 @Author : Crisimple @Github : https://crisimple.github.io/ @Contact : Crisimple@foxmail.com @License : (C)Copyright 2017-2019, Micro-Circle @Desc : None """
""" 判斷一個整數是不是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是同樣的整數。 示例 1: 輸入: 121 輸出: true 示例 2: 輸入: -121 輸出: false 解釋: 從左向右讀, 爲 -121 。 從右向左讀, 爲 121- 。所以它不是一個迴文數。 示例 3: 輸入: 10 輸出: false 解釋: 從右向左讀, 爲 01 。所以它不是一個迴文數。 進階: 你能不將整數轉爲字符串來解決這個問題嗎? 來源:力扣(LeetCode) 連接:https://leetcode-cn.com/problems/palindrome-number 著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。 """

""" 思路一: 1.將整數轉化爲字符串; 2.若是是迴文數的話,正反字符串是同樣的,返回True;若是不是的話,字符串確定不同,返回False """
class Solution1:
    def isPalindrome(self, x: int) -> bool:
        if str(x) == str(x)[::-1]:
            return True
        else:
            return False


""" 思路二: 1.將整數反向處理; 2.比較原數和處理過的數據,若是相等則是,不然不是 """
class Solution2:
    def isPalindrome(self, x: int) -> bool:
        if x < 0:
            return False

        m, n = x, 0
        while m:
            """ " / " 表示浮點數除法,返回浮點結果; " // " 表示整數除法,返回不大於結果的一個最大的整數 " % " 表示除法的餘數,又叫取模運算 """
            n = n * 10 + m % 10
            m = m // 10

        if x == n:
            return True
        else:
            return False


if __name__ == "__main__":
    """ 測試用例一 """
    s1 = Solution1()
    x1 = 12321
    # print(s1.isPalindrome(x=x1))

    """ 測試用例二 """
    s2 = Solution2()
    x2 = -12321
    print(s2.isPalindrome(x=x2))

print(121 % 10)
print(121 // 10)
print(12 // 10)
print(1 // 10)

str1 = "soose"
print(str1[::-1])

複製代碼

13. 羅馬數字轉整數

LeetCode題源測試

GitHub示例spa

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
""" @File : 0013_羅馬數字轉整數.py @Time : 2019/11/4 10:51 @Author : Crisimple @Github : https://crisimple.github.io/ @Contact : Crisimple@foxmail.com @License : (C)Copyright 2017-2019, Micro-Circle @Desc : None """

""" 羅馬數字包含如下七種字符: I, V, X, L,C,D 和 M。 字符 數值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 羅馬數字 2 寫作 II ,即爲兩個並列的 1。12 寫作 XII ,即爲 X + II 。 27 寫作  XXVII, 即爲 XX + V + II 。 一般狀況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫作 IIII,而是 IV。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減少數 1 獲得的數值 4 。一樣地,數字 9 表示爲 IX。這個特殊的規則只適用於如下六種狀況: I 能夠放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。 X 能夠放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。  C 能夠放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。 給定一個羅馬數字,將其轉換成整數。輸入確保在 1 到 3999 的範圍內。 示例 1: 輸入: "III" 輸出: 3 示例 2: 輸入: "IV" 輸出: 4 示例 3: 輸入: "IX" 輸出: 9 示例 4: 輸入: "LVIII" 輸出: 58 解釋: L = 50, V= 5, III = 3. 示例 5: 輸入: "MCMXCIV" 輸出: 1994 解釋: M = 1000, CM = 900, XC = 90, IV = 4. 來源:力扣(LeetCode) 連接:https://leetcode-cn.com/problems/roman-to-integer 著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。 """


""" 思路一: 1.規律是羅馬數字轉換成整數時,若是前一個數大於等於後一個數,只須要加上前一個羅馬數字對應的整數便可; 若是前一個數小於後一個數的時候,減去前一個羅馬數對應的整數; 2.直到轉換到倒數第一個數,因爲最後一個數沒有可比較對象了,因此加上最後一個數; 3.將1和2的結果求和,便可獲得最終轉換完的整數結果 """
class Solution1:
    def romanToInt(self, s: str) -> int:
        """ @param s: 被轉換的羅馬數字 @return: 轉換後返回的 """
        roman_num = {
            'M': 1000,
            'D': 500,
            'C': 100,
            'L': 50,
            'X': 10,
            'V': 5,
            'I': 1
        }
        sum_num = 0
        for i in range(len(s)-1):
            if roman_num[s[i]] >= roman_num[s[i+1]]:
                sum_num += roman_num[s[i]]
            else:
                sum_num -= roman_num[s[i]]
        last_num = s[len(s)-1]
        sum_num = sum_num + roman_num[last_num]
        return sum_num


if __name__ == "__main__":
    rt = Solution1()
    print(rt.romanToInt("XC"))
複製代碼

14.最長公共前綴

LeetCode題源code

GitHub示例

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File    :   0014_最長公共前綴,py
@Time    :   2019/11/4 16:34
@Author  :   Crisimple
@Github :    https://crisimple.github.io/
@Contact :   Crisimple@foxmail.com
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""
from typing import List

"""
編寫一個函數來查找字符串數組中的最長公共前綴。

若是不存在公共前綴,返回空字符串 ""。

示例 1:
輸入: ["flower","flow","flight"]
輸出: "fl"

示例 2:
輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。

說明:
全部輸入只包含小寫字母 a-z 。

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/longest-common-prefix
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。
"""

"""
內置函數: zip() 函數用於將可迭代的對象做爲參數,將對象中對應的元素打包成一個個元組,而後返回由這些元組組成的列表。
思路一: 1.利用zip() 函數將字符串列表打包成一個個元組;
       2.由於是共同的前綴, 因此用集合set將元組去重;
       3.若是說去重後的結合長度==1, 則說明是字符串共有的元素,則進行字符拼接,若是不是則推出循環
時間複雜度: O(n) 
"""
class Solution1:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        """
        @param strs: 字符串列表
        @return: 公共的字符串前綴
        print(i)
        print(set(i))
        print(len(set(i)))
        """
        s = ""
        for i in zip(*strs):
            # 由於set具備自然的去重性
            if len(set(i)) == 1:
                s += i[0]
            else:
                break
        return s


if __name__ == "__main__":
    s1 = Solution1()
    print(s1.longestCommonPrefix(['flower', 'fly', 'flay']))

複製代碼

xx.模板

LeetCode題源

GitHub示例

複製代碼
相關文章
相關標籤/搜索