能看这篇文章的朋友,确定是对算法(找工做涨工资)感兴趣的。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示例】
复制代码