嗯前天晚上肝夜没做题 昨天做的也没总结 今天先把昨天做的总结了
7 整数反转
嗯这道题比较easy,我直接用字符串切片的方法把数转过来,唯一需要注意的就是要跟大整数pow(2,31)比较,刚开始忘记比较了第一遍没过,然后总结下py3中反转字符串的几种方法把。
(1)字符串切片
这个方法是最简单的也最容易被人想出来的了,也就是str[start:end:step] ,其中默认取值为[start,end),start默认为1,end默认为-1,即分别取到首尾,中间可以任意更换,那么step表示的就是步长,可以带方向的咯比如1就是从左到右步长为1,2就是步长为2跳一个取,-1就是从右到左了,于是反转可以定义为[::-1],把步长设置为-1,即可实现字符串反转。强调下切片start<end的情况下即从左到右,如果步长为反方向的话,切片结果为空。相反同理。
(2)递归的方法
str = xxxxxxxx
def reverse(x):
if x=='':
return x
else :
return reverse(x[1:]) + x[0]
递归比较容易理解吧,就是一直递归到后面在反向弹栈的过程中从后先加当前元素从而实现逆序。
(3)转list
list带有内置的反转函数 list.reverse()
那么我们可以先将str通过list(str)的方式转换为list,调用reverse函数后,通过join函数连接成字符串return。
str = xxxxxxxx
lis = list(str)
lis.reverse()
result = "".join(lis)
在这里说一下join函数,join函数官方定义为将前面的str链接到join函数传入的可迭代对象中,也就是说传入join函数的可迭代对象的每一个元素之间都用join函数前面的str进行连接。
(4)通过reduce函数
x = reduce(lambda x,y:y+x,s)
13.罗马数字转数字:
题意如此,题目很简单只是我很捞在4,9,40,90,400,900都用了if判断,看了大神的解法真的?叫绝。
class Solution:
def romanToInt(self, s: str) -> int:
d = {'I':1, 'IV':3, 'V':5, 'IX':8, 'X':10, 'XL':30, 'L':50, 'XC':80, 'C':100, 'CD':300, 'D':500, 'CM':800, 'M':1000}
return sum(d.get(s[max(i-1, 0):i+1], d[n]) for i, n in enumerate(s))
构建一个字典记录所有罗马数字子串,注意长度为2的子串记录的值是(实际值 - 子串内左边罗马数字代表的数值)。然后通过对字符串遍历,如果当前字符前一位+这个字符在字典的key中就返回这个双字符键的value否则返回这个字符键的value,举个栗子,假如碰到了IV,那么首先读I发现前面没有双字符就+1,读到V发现前面的I可以组成字典内的键就+3,也就是+4。
真的是巧妙利用了字典的get函数啊!dic.get(key,default), 查找字典中是否有key这个键,有了返回这个键的value,没有返回定义的default。巧妙巧妙!
14.最长公共前缀
沙雕本精的做法:找到list中最短的那个字符串,然后以这个字符串的每一位在整个list的所有字符串中进行比较,一旦不匹配结束训练返回最长公共前缀,时间复杂度不用说哦 o(n2)
看到了大神的两种python拍大腿的解法天。。。自己就是想不到qwq。
1、利用python的max()和min(),在Python里字符串是可以比较的,按照ascII值排,举例abb, aba,abac,最大为abb,最小为aba。所以只需要比较最大最小的公共前缀就是整个数组的公共前缀!因为只要最大和最小的公共前缀相同,辣么中间任何一个元素由于ascll码大小的缘故是一定小的!!!
def longestCommonPrefix(self, strs):
if not strs: return ""
s1 = min(strs)
s2 = max(strs)
for i,x in enumerate(s1):
if x != s2[i]:
return s2[:i]
return s1
那么python中max函数,如果参数类型是str或者list的呢,就返回最大的元素。如果参数是一个个元组(list),就从左到右比较每个元组的ascii码,如果参数是字典就比较key的ascii码咯。
2.利用zip函数从左到右解压比较的方法!把str看成list然后把输入看成二维数组,左对齐纵向压缩,然后把每项(从左到右每个元素的对应字符)利用集合去重,之后遍历list中找到元素长度大于1之前的就是公共前缀!
def longestCommonPrefix(self, strs):
if not strs: return ""
ss = list(map(set, zip(*strs)))
res = ""
for i, x in enumerate(ss):
x = list(x)
if len(x) > 1:
break
res = res + x[0]
return res
这里复习下zip函数
zip函数将可迭代对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。可以传入多个可迭代对象。
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]