写这篇博客的目的是博主觉得自己对python语法不够熟悉。。所以尝试通过leetcode写几道题熟悉一下列表/元组等类型的操作,但是写完感觉算法能力太弱了,写出来的代码不够简洁 #
一、python的一些基本数据类型 #
Copy
'''
列表:用[]定义,类似于数组;用list()创建
可变的数据类型:append\insert\clear\pop\remove\reverse\opy
'''
lst=['hello' ,'world' ,98.5 ,77 ]
lst1=list ("helloworld" )
lst2=list (range (1 ,10 ,2 ))
print (lst)
print (lst1)
print (lst2)
print (lst+lst1+lst2)
print (lst*3 )
del lst
lst=['h' ,'hh' ,'hhhh' ]
for item in lst:
print (item)
for i in range (0 ,len (lst)):
print (lst[i])
for index,item in enumerate (lst,start=1 ):
print (index,item)
lst.append('sql' )
lst.insert(1 ,100 )
lst.remove('h' )
print (lst)
lst.pop(3 )
lst.reverse()
print (lst)
new_list=lst.copy()
lst.clear()
print (new_list+lst)
lst=[1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ]
lst.sort()
print (lst)
lst.sort(reverse=True )
print (lst)
lst1=['apple' ,'Orange' ,'banana' ]
lst1.sort()
print (lst1)
lst1.sort(key=str .lower)
print (lst1)
nwe_lst=sorted (lst1)
print (lst1)
print (nwe_lst)
import random
del lst
lst=[item for item in range (1 ,11 )]
print (lst)
lst.clear()
lst=[random.randint(1 ,100 ) for _ in range (10 )]
print (lst)
lst.clear()
lst=[i for i in range (1 ,10 ) if i%2 ==0 ]
print (lst)
Copy
'''
元组:不可变序列,用()创建/用tuple创建
'''
t=('python' ,'hello' ,'world' )
lst=['python' ,'hello' ,'world' ]
t2=t[0 :3 :2 ]
lst2=lst[0 :3 :2 ]
print (t2)
print (lst2)
del t
t=(i for i in range (1 ,4 ))
print (t)
t=tuple (t)
print (t)
Copy
'''
字典:可变序列,有点像指针:索引用的键和对应的值构成成对的关系
特点:元组由于不可变,可以作为键,而列表不可以
'''
d={10 :'cat' ,20 :'dog' ,30 :'pet' ,40 :'z00' }
lst1=[10 ,20 ,30 ,40 ]
lst2=['cat' ,'dog' ,'pet' ,'z00' ]
zipobj=zip (lst1,lst2)
print (zipobj)
for key,value in zipobj:
print (key,'---' ,value)
othobj=dict (zipobj)
print (othobj)
d={'hello' :10 ,'world' :20 ,'python' :30 }
print (d['hello' ])
print (d.get('java' ))
print (d.get('java' ,'NONE' ))
for item in d.items():
print (item)
for key,value in d.items():
print (key,'---' ,value)
d={1001 :'limei' ,1002 :'wanghua' ,1003 :'zhangfeng' }
lst=list (d.items())
print (lst)
print (d)
import random
d={item:random.randint(1 ,100 ) for item in range (4 )}
print (d)
lst1=[1001 ,1002 ,1003 ,1004 ]
lst2=['chen' ,'yiyi' ,'lili' ]
dd={key:value for key,value in zip (lst1,lst2)}
print (zip (lst1,lst2))
print (dd)
Copy
'''
集合类型:可变数据类型,用{}定义,无序不重复序列
'''
s={10 ,20 ,30 ,40 }
del s
s=set ('HELOWORLD' )
s1=set ([20 ,23 ,55 ])
s2=set (range (1 ,10 ))
print (s)
print (s2)
二、题目 #
解码方法 #
1.题目描述
2.思路:先将字符串转化为列表,其中字符’0‘必须跟在一个数字后面并且组成的数字<26;接着使用递归,通过10/20对列表进行分组然后将子列表传给counter函数进行计算解码方法总数,counter函数的具体实现:判断传入列表的长度进行对应的操作
3.代码实现
Copy
class Solution :
def numDecodings (self, s: str ) -> int :
ls=list (s)
newls=[]
i=0
if int (ls[0 ])==0 :
return 0
while (i<len (ls)):
if ls[i]=='0' :
newls[len (newls)-1 ]=int (newls[len (newls)-1 ]*10 )
if newls[len (newls)-1 ]==200 or newls[len (newls)-1 ]==100 :
return 0
elif ls[i]!='0' :
newls.append(int (ls[i]))
i+=1
print (newls)
if len (newls)==1 and (newls[0 ]==10 or newls[0 ]==20 ):
return 1
j=0
count=1
index=0
while j<len (newls):
if newls[j]==10 or newls[j]==20 :
if j==0 :
count*=1
index+=1
else :
count*=Solution.counter(newls[index:j])
index=j+1
j+=1
if index<j+1 :
count*=Solution.counter(newls[index:j])
return count
def counter (ls:list )->int :
if not ls:
return 0
elif len (ls)==1 :
return 1
if len (ls)==3 :
v1=int ("" .join(map (str ,ls[0 :2 ])))
v2=int ("" .join(map (str ,ls[1 :3 ])))
if v1>26 and v2>26 :
return 1
elif v1<=26 and v2<=26 :
return 3
else :
return 2
if len (ls)==2 :
v1=int ("" .join(map (str ,ls[0 :2 ])))
if v1<=26 :
return 2
else :
return 1
if len (ls)==4 :
tab=0
v1=int ("" .join(map (str ,ls[0 :2 ])))
tab+=Solution.counter(ls[1 :4 ])
if v1<=26 :
tab+=(Solution.counter(ls[0 :2 ])*Solution.counter(ls[2 :4 ]))//2
return tab
if len (ls)>4 :
v1=int ("" .join(map (str ,ls[0 :2 ])))
fc=Solution.counter(ls[1 :len (ls)])
if v1<=26 :
fc+=Solution.counter(ls[2 :len (ls)])
return fc
Copy
def numDecodings (s:str ) -> int :
cnt = [1 ,1 ] + [0 ] * len (s)
s = "99" + s
for i in range (2 , len (s)):
if ( 10 <= int (s[i-1 :i+1 ]) <= 26 ):
cnt[i] += cnt[i-2 ]
if (s[i] != '0' ):
cnt[i] += cnt[i-1 ]
return cnt[-1 ]
合并区间 #
1.题目描述:以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间
2.思路:递归(二路归并的思想)没解决,但是写着写着对题目的理解就搞混了,所以也并没有实现。
3.代码实现
Copy
class Solution :
def devide (intervals:list )->list :
result=[]
if len (intervals)==1 :
result.append(intervals[0 ])
return result
if len (intervals)==2 :
if intervals[0 ][1 ]>=intervals[1 ][0 ] and intervals[0 ][0 ]<=intervals[1 ][0 ]:
if intervals[0 ][1 ]<=intervals[1 ][1 ]:
result.append([intervals[0 ][0 ],intervals[1 ][1 ]])
return result
elif intervals[0 ][1 ]>intervals[1 ][1 ]:
result.append([intervals[0 ][0 ],intervals[0 ][1 ]])
return result
elif intervals[0 ][1 ]>=intervals[1 ][0 ] and intervals[0 ][0 ]>intervals[1 ][0 ]:
if intervals[1 ][0 ]==intervals[1 ][1 ]:
result.extend(intervals[1 ::-1 ])
return result
if intervals[0 ][1 ]<=intervals[1 ][1 ]:
result.append([intervals[1 ][0 ],intervals[1 ][1 ]])
return result
elif intervals[0 ][1 ]>intervals[1 ][1 ]:
result.append([intervals[1 ][0 ],intervals[0 ][1 ]])
return result
return result
else :
result.extend(intervals[0 :2 ])
return result
elif len (intervals)==3 :
item3=[]
item3=Solution.devide(intervals[0 :2 ])
if (len (item3)==1 ):
item33=[item3[0 ],intervals[2 ]]
item33r=[]
item33r.extend(Solution.devide(item33))
return item33r
elif (len (item3)==2 ):
item34=[item3[1 ],intervals[2 ]]
item34r=[]
item34r.append(item3[0 ])
item34r.extend(Solution.devide(item34))
return item34r
elif len (intervals)>3 :
result.extend(Solution.devide(intervals[0 :int (len (intervals)/2 )]))
result.extend(Solution.devide(intervals[int (len (intervals)/2 ):len (intervals)]))
return result
def merge (self, intervals: List [List [int ]] ) -> List [List [int ]]:
result=Solution.devide(intervals)
return result
Copy
class Solution :
def merge (self, intervals: List [List [int ]] ) -> List [List [int ]]:
intervals.sort(key=lambda x: x[0 ])
merged = []
for interval in intervals:
if not merged or merged[-1 ][1 ] < interval[0 ]:
merged.append(interval)
else :
merged[-1 ][1 ] = max (merged[-1 ][1 ], interval[1 ])
return merged
4.lambda函数的学习
Copy
add=lambda x,y:x+y
result=add(2 ,3 )
print (result)
nums=[1 ,2 ,3 ,4 ,5 ]
result2=[item for item in map (lambda x:x**2 ,nums)]
result22=map (lambda x:x**2 ,nums)
print (result2)
print (list (result22))
nums3=[[9 ,8 ,7 ],[7 ,6 ,5 ],[5 ,4 ,3 ],[3 ,2 ,1 ]]
nums3.sort(key=lambda x:x[0 ])
print (nums3)
nums33=[[9 ,8 ,7 ],[7 ,6 ,5 ],[5 ,4 ,3 ],[3 ,2 ,1 ]]
nums33.sort(key=lambda x:(x.sort(),x[0 ]))
print (nums33)
字符串转整数 #
1.题目描述:请你来实现一个 myAtoi(string s)
函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi
函数)
2.思路:感觉这题有点咬文嚼字=_=,除去所有不能转化为数字的字符串的情况就可以进行拼接了
3.代码实现
Copy
class Solution :
def myAtoi (self, s: str ) -> int :
if s=="" :
return 0
if s[0 ].isdigit()==False and s[0 ]!=' ' and s[0 ]!='+' and s[0 ]!='-' :
return 0
ss = list (s)
i = 0
ii = 0
while i < len (ss) and (ss[i] > '9' or ss[i] < '0' ):
if s[i].isalpha()==True :
return 0
i += 1
if i < len (ss):
index=s.find('-' ,0 ,i)
index1=s.find('+' ,0 ,i)
if index!=-1 and index1!=-1 :
return 0
if (index1>0 and s[index1+1 ].isdigit()==False ) or (index>0 and s[index+1 ].isdigit()==False ):
return 0
if index>=0 :
while i < len (ss) and ss[i] <= '9' and ss[i] >= '0' :
ii = ii * 10 + int (ss[i])
i += 1
ii=0 -ii
elif index<0 :
while i < len (ss) and ss[i] <= '9' and ss[i] >= '0' :
ii = ii * 10 + int (ss[i])
i += 1
if ii>2 **31 -1 :
ii=2 **31 -1
elif ii<0 -2 **31 :
ii=0 -2 **31
return ii
无重复字符的最长字串 #
1.题目描述:给定一个字符串 s
,请你找出其中不含有重复字符的最长子串的长度。
2.代码实现
Copy
class Solution :
def lengthOfLongestSubstring (self, s: str ) -> int :
ss=""
max =0
for i in range (len (s)):
if s[i] not in ss:
ss+=s[i]
elif s[i] in ss:
if max <len (ss):
max =len (ss)
ss=""
tmp=i
while i-1 >=0 and s[tmp-1 ]!=s[i]:
ss+=s[tmp-1 ]
tmp-=1
ss=ss[::-1 ]
ss+=s[i]
if max <len (ss):
max =len (ss)
return max
final #
总结:学会了列表/元组这类迭代器的一些基本操作,以及lambda函数/map(func,iterable)/append/extend等函数的使用,有时候新建一些数组来存放新内容要比递归高效率。在使用python时多思考方法,因为python有很多意想不到的库函数可以解决复杂问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码