1、两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
答案:
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: 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
注:enumerate() 函数
用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
enumerate(sequence, [start=0])
sequence -- 一个序列、迭代器或其他支持迭代对象。
start -- 下标起始位置。
返回 enumerate(枚举) 对象。
2、整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
答案:
class Solution:
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
if x==0:
return 0
str_x = str(x)
x = ''
if str_x[0] == '-':
x += '-'
x += str_x[len(str_x)-1::-1].lstrip("0").rstrip("-")
x = int(x)
if -2**31<x<2**31-1:
return x
return 0
3、回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
答案:
class Solution:
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
if x < 0:
return False
else:
y = str(x)[::-1]
if y == str(x):
return True
else:
return False
注:str[len(str) -1::-1].lstrip("0").rstrip("-")
str[len(str) -1::-1]:字符串[开始点,结束点,步长],步长为负,从右到左
lstrip("0"):左边删0
rstrip("-"):右边删-
4、罗马字符转数字
罗马数字包含以下七种字符: 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 的范围内。
答案:
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
a = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
ans=0
for i in range(len(s)):
if i<len(s)-1 and a[s[i]]<a[s[i+1]]:
ans-=a[s[i]]
else:
ans+=a[s[i]]
return ans
5、最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
答案:
class Solution:
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if "" in strs:
return ""
n = len(strs)
if n > 1:
pr = ""
for index,i in enumerate(strs[0]):
pr += i
for j in range(1, n):
if pr not in strs[j][:index+1]:
break
else:
continue
break
else:
return pr
return pr[:-1]
else:
return "" if not n else strs[0]
注:下面的值在解释器中作为布尔表达式时,会被看做假
False None 0 "" () [] {}
循环内使用break语句时,也是可以加else的,仅在没有调用break时执行。
这里的几个break、continue看了2个小时没看懂,不开心,明天问匡神。
def longestCommonPrefix(self, strs):#mengmeng
"""
:type strs: List[str]
:rtype: str
"""
if strs==[]:
return ""
out = ""
flag = 0
for num,i in enumerate(strs[0]):
# print(num,i)
for j in strs:
if j[:num+1]!=out+i:
flag=1
break
if flag == 1:
break
else:
out = out+i
return out
昨天纠结,浪费了太多时间,以后注意一题不要超过30min,新手切忌钻牛角尖,今天和同事交流一下,都觉得上面的程序难懂,换一个就是了,下次千万不要浪费时间。
class Solution:#yongyong
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if len(strs) == 1:
return strs[0]
elif len(strs) == 0:
return ""
else:
res = ""
if_break=False
for index, letter in enumerate(strs[0]):
res += letter
# print(res)
for i in range(1, len(strs)):
# print(strs[i][:index + 1])
if res != strs[i][:index + 1]:
if_break=True
break
if if_break==True:
break
if if_break == True:
return res[:-1]
else:
return res
法三:
from multiprocessing.dummyimport Poolas ThreadPool#kaiyue
question = ['flower', 'flow', 'flight']
def get_index(x:str, i:int):
return x[:i]
for iin range(1, str(question[0]).__len__()):
pool = ThreadPool(question.__len__())
a =set(pool.map(lambda x: get_index(x=x, i=i), question))
b =set(pool.map(lambda x: get_index(x=x, i=i+1), question))
pool.close()
if b.__len__() !=1:
print(a)
break
网友评论