力扣天天练,day1

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小百里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值