LeetCode 每日一题(二)

公交站间问题

 本题我觉得会没注意的点就在于判断start和destination的大小问题,因为我使用的是range()函数,假设我的len(distance)=7,start=7,destination=2,若没有进行大小比较,则循环会自动暂停,所以需要多一步判断。所以我这个方法比较笨,算是暴力遍历了。

class Solution(object):
    def distanceBetweenBusStops(self, distance, start, destination):
        """
        :type distance: List[int]
        :type start: int
        :type destination: int
        :rtype: int
        """
        length=len(distance)
        sum0=sum1=sum2=0
        for i in range(0,length):
            sum2=sum2+distance[i]
        if start>destination:
            start,destination=destination,start//进行终起点对换
        for j in range(start,destination):
            sum0=sum0+distance[j]
            sum1=sum2-sum0 
        if sum0<sum1:
            return sum0
        else:
            return sum1
        

两数之和

①我的想法就是把 利用两层循环求出和,不能重复出现的题设用pop即可,但是总体的运行效率和所占内存较高。

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        num=len(nums)
        for i in range(0,num-1):
            for j in range(i+1,num):
                sum0=nums[i]+nums[j]
                if sum0==target:
                    nums.pop(i)
                    return [i,j]

②参考学习了一下别人的题解,用字典来做。enumerate函数为遍历函数,以下的方法就少了一层循环,而且少了每一次循环所需进行的判定。更加简洁明了。

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//num+?=target
            if another_num in hashmap:
                return [hashmap[another_num], index]//返回another_num在字典中的位置,index是其索引值
            hashmap[num] = index//进行下一个循环的跳转
        return None

分数加减运算

 我的想法就是先将分子,分母,以及其中的加减号都先分离出来,之后进行将分母扩大到7560(其为1-9共同可乘到的数字),再将分子扩大到相应的倍数。接下来就是进行分子的加减之和(因为分母均为7560,不用管它),但是我的程序问题就出在无法很好地将分子与其对应的符号结合起来,导致计算结果一直有问题,我估计是循环上哪出了问题,现在也无法解决。有没有大神能帮帮我5555。最后就是找分子分母的最大公约数(我用的是辗转相除法),最终得到题目所需要的答案格式。我觉得难点有在于他的加减符号位置不定性,很困扰我。

class Solution(object):
    def fractionAddition(self, expression):
        """
        :type expression: str
        :rtype: str
        """
        
        #提出所有的加减符号
        list1=[]
        for i in expression:
            if ord(i)==45 or ord(i)==43:
                list1.append(i)
        #asc=[ord(x) for x in list1]#转为asc码
        jianlist=expression.split("+")
        jianstr=' '.join(jianlist)
        #分离出分子分母
        jianlist0=jianstr.split("/")
        jianstr0=' '.join(jianlist0)
        jianlist1=jianstr0.split("+")
        jianstr1=' '.join(jianlist1)
        jianlist2=jianstr1.split("-")
        jianstr2=' '.join(jianlist2)
        jianlist3=jianstr2.split(" ")
        jianstr3=''.join(jianlist3)
        fenmu=jianstr3[1::2]
        #求出最大公约数
        summ=1
        sumz=1
        fenzi=jianstr3[::2]
        fenzi1=[]
        fenmu1=[]
        for i in range(0,len(fenmu)):
            summ=summ*int(fenmu[i])
        #分子分母分别乘以达到最大公约数
        count=0
        yue=0
        list0=[]
        for i in jianstr3:
            if count%2!=0:
                yue=7560//int(i)#7560应为1-10的最小公约数
                i=int(i)*yue
                list0.append(i)
                count+=1
            else:
                i=int(i)*yue
                list0.append(i)
                count=+1
                
        sum0=0
        for x in range(0,len(list1)):
            for y in range(0,len(list0),2):
                if len(list1)==1:#只有两位数加减,且减号不在第一位
                    if ord(list1[x])==45:
                        sum0=list0[2]-list0[0]
                    else:
                        sum0=list0[2]+list0[0]
                else:
                    if ord(list1[x])==45:
                        sum0=sum0-list0[y]
                    if ord(list1[x])==43:
                        sum0=sum0+list0[y]
        
        m=7560
        n=abs(sum0)
        if n!=0:
            r = m % abs(sum0) #求最大公约数
            while r != 0:
                m = n
                n = r
                r = m % n#n为最大公约数
                return(sum0//n,'/',m//n)
        else:
            return('0/1')

要是大家有更好的解法,也欢迎在评论区跟我沟通交流呀!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值