美文网首页
Python做题之路leetcode#001

Python做题之路leetcode#001

作者: NoviceQAQ | 来源:发表于2018-02-28 10:23 被阅读0次

    very important python(VIP)

    python是门上手容易些的语言,经过了一小段时间的学习,为了巩固所学的知识开始在leetcode上做题,毕竟Practice Make Prefect!
    正式开始前必须吐槽下,作为一名计算机爱好者,博客本应该属于CSDN,但是不知浏览器的原因还是博客的原因,在Unbuntu下CSDN的行距实在是让我感到十分傻逼深恶痛绝!最终让我选择简书开始我的博客之旅。


    leetcode #001 Two Sum

    Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution, and you may not use the same element twice.
    给定一组整数,将两个数的返回指数相加,使它们相加成一个特定的目标。您可以假设每个输入都有一个解决方案,您可能不会使用相同的元素两次。
    例如:
    Given nums = [2, 7, 11, 15], target = 9,
    Because nums[0] + nums[1] = 2 + 7 = 9,
    return [0, 1].

    题目分析

    题目中说到传入一个列表,及一个目标数,这个目标数等于列表中两个元素相加的和,但是不能是相同的元素相加。

    假设列表 值为0,1,2,3,4 那么key也是0,1,2,3,4 这样就不会把自己搞晕,上了年纪学编程脑子不灵活了。然后让我们把每个相加的过程画出来。
    列表的键和值总共有5个
    0+1 与key为0的value相加可以总结为0+range(1,5)
    0+2
    0+3
    0+4
    1+2 与key为1的value相加可以总结为0+range(2,5)
    1+3
    1+4
    2+3 与key为2的value相加可以总结为0+range(3,5)
    2+4
    3+4 与key为3的value相加可以总结为0+range(4,5)

    可以将上述规律总结为共有两次循环!

    • 第一次循环:
      两数相加的第一个数的循环,0到3的循环,循环4次,因为不能两个相同的元素相加,所以不会出现list[4]+[4]的情况,也就不会出现第5次循环。假设m为第一个value的key,m=0,循环四次可以理解为:
      m = 0
      while m < 5-1:
      m += 1

    • 第二次循环:
      两数相加的第二个数的循环,1234,234,34,4的循环,每当第一个数加1,第二个相加的数减少一个,由前向后减少。也因为不能两个相同的元素相加,所以不会出现list[0]+list[0]的情况,第二个数的第一个key为1,。假设m为第一个value的key,m=0,可以理解第二个数为:
      for i in range(m+1,5):
      list[i]

    接下来将两个循环组合一下就完成了函数:
    m = 0
    while m < 5-1:
    for i in range(m+1,5):
    list[m] + list[i]
    m += 1

    做题

    有了逻辑一切就变得简单了,根据leetcode的要求完成代码:

    class Solution:
        def twoSum(self, nums, target):
            """
            :type nums: List[int]
            :type target: int 
            :rtype: List[int]
            """
            #第一个传入的数为列表,第二个传入的数为目标数
            self.nums = nums
            self.target = target
    
            #获得list的长度,假设m为0就是从第一个下标开始
            n = len(nums)
            m = 0
    
            #抛异常
            try:
                #断言语句判断传入第二个参数是否为int第一个参数是否为list
                assert(type(target) == int)
                assert(type(nums) == list)
                #断言语句判断一个参数list中每个元素是否为int
                for x in range(n):
                    assert(type(nums[x]) == int)
    
            #抛异常出现上述断言语句为False时候的回答
            except AssertionError as reason:
                print('出错啦!nums必须为列表且列表中元素必须为int,target类型必须为int')
    
            #抛异常当上述断言语句为True时候执行
            else:
                #带入刚刚分析出来的函数n为list长度
                while m < n-1:
                    for i in range(m+1,n):
                        #判断两数相加是否与传入的第二个参数相等
                        nums_sum = nums[m] + nums[i]
                        #如果相等返回这两个value的key
                        if target == nums_sum:
                            return [m,i]
                            print("%d是nums[%d]与nums[%d]相加的和" % (target,m,i))
                    m += 1
    

    上面有很多在做题事都是没必要的,只是为了巩固知识啰嗦了点。

    相关文章

      网友评论

          本文标题:Python做题之路leetcode#001

          本文链接:https://www.haomeiwen.com/subject/ovqbxftx.html