能看這篇文章的朋友,確定是對算法(找工做漲工資)感興趣的。python
【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))
複製代碼
【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))
""" 測試用例二 """
複製代碼
【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])
複製代碼
【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"))
複製代碼
【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']))
複製代碼
【GitHub示例】
複製代碼