Python做题之路leetcode#001

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)