topic14最长公共前缀
题目描述:编写一个函数来查找字符串中的最长公共前缀,如果不存在公共前缀,返回字符串“”
思路1:暴力匹配法——时间复杂度O(n2)
def longestCommonPrefix(str):
strLength=len(str)
longestprofix='' #记录最长公共前缀
shortestLength=200 #记录列表中长度最短的元素
for i in range(0,strLength):
shortestLength=min(shortestLength,len(str[i]))
for j in range(0,shortestLength):
for k in range(0,strLength):
if str[k][j]!=str[0][j]:
return longestprofix
longestprofix+=str[0][j] #将都出现过的元素加到公共前缀中
return longestprofix
思路2:按照ASCII码排序,找出其中最大的和最小的,最大的和最小的公共前缀就是最长公共前缀(python中字符串可以比较,按照ASCII码排序)——时间复杂度O(n)
def optLongestCommonPrefix(str):
if len(str)==0:
return ''
maxStr=max(str)
minStr=min(str)
longprofix=''
for i in range(0,min(len(maxStr),len(minStr))):
if maxStr[i]!=minStr[i]:
return longprofix
longprofix+=minStr[i]
return longprofix
topic11:盛最多水的容器
题目描述:给定一个长度为n的整数数组height,有n条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
,找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
思路1:暴力解法,计算出可能的面积,共n(n-1)/2个,时间复杂度为O(n2)——会超时,空间复杂度O(n2)
def maxArea(height):
temp=[]
for i in range(0,len(height)):
for j in range(i+1,len(height)):
if height[i]<height[j] :
temp.append((j-i)*(height[i]))
else:
temp.append((j-i)*(height[j]))
maxarea=max(temp)
return maxarea
思路2:双指针,左右各一个,先将最大储水量定为最大的长方形,如果左边高度小于右边则左指针向右移,否则又指针向左移,时间复杂度O(n),空间复杂度O(1)
注:双指针适用于数组或者链表,常见场景——已经排序的链表或数组,滑动窗口等
def maxArea(height):
ans=0 #初始为0
left=0
right=len(height)-1
while left<right:
area=(right-left)*min(height[left],height[right])
if ans<area:
ans=area
if height[left]<height[right]:
left+=1
elif height[left]>=height[right]:
right-=1
return ans
附:(常常记错)在 Python 中,取余运算符是 %
,而不是 //
。//
是整数除法运算符,用于将两个数相除并向下取整,得到一个整数结果。而 %
是取余运算符,用于计算两个数相除后的余数。
topic12:整数转罗马数
例如, 罗马数字 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。
给你一个整数,将其转为罗马数字。
思路:由于题目所给范围小,可以用穷举法的思想,本题类似于求整数中各个位数,加上4,9等限制条件,最后循环输出(有点贪心算法的意思,先把符合条件的大的用完,再用小的)
def intToRoman(self, num: int) -> str:
listA=['I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M']
listA1=listA[::-1]
listB=[1,4,5,9,10,40,50,90,100,400,500,900,1000]
listB1=listB[::-1]
i=0
su=0
result=''
while num>0:
if num>=listB1[i]:
su=int(num/(listB1[i]))
result+=listA1[i]*su
num=num%(listB1[i])
i+=1
else:
i+=1
return result