在做力扣(LeetCode)第一题——两数之和时碰到的问题与解决办法

1.何为__init__()?

力扣(LeetCode)给出的代码段中,是使用 Python中的 class类来呈现代码的,在对类的理解中我出现了疑惑,记得在大二学习java的时候每次定义一个类都会有与类名相同的初始化函数,为什么在题目中Python没有给出?

答:Python中类的初始化方法是'__init__()',(注意init左右两边分别是两个下划线),'__init__()'可以实现对所创建类的初始化,同时在创建对象的时候对其相关属性进行封装,如果更改为其它名字,那在封装的过程中就需要执行所修改名字的初始化方法。所以当别人用我们的类的时候,就必须先执行一次我们自己所定义的方法,这样不合理。

2.在力扣(LeetCode)中没有给出nums和target的输入从何而来,于是我就做了一个输入 ,如图:

class Solution:
    def __init__(self,nums,target):
        self.nums=nums
        self.target=target
    def twoSum(self):
        n=len(self.nums)
        for i in range(n):
            for j in range(i+1,n):
                if(self.nums[i]+self.nums[j]==self.target):
                    return (i,j)
        return "没有两个数相等于target"

if __name__=='__main__':
    arr=input('以空格为间隔连续输入一个数组')
    nums = [int(n) for n in arr.split()]
    target=int(input())
    a=Solution(nums,target)
    print(a.twoSum())

如图所示,我先定义了Solution的类,并用__init__()对其初始化,然后定义了twosum()的方法,实现两数之和,通过if __name__=='__main__':来调用该类。

3.在解决问题2的过程中,还有一些小问题:

1.首先,我一直不知道if __name__=='__main__':的作用到底是什么

于是我就去查了一下。了解到,与Java、C、C++等几种语言不同的是,Python是一种解释型脚本语言,在执行之前不同要将所有代码先编译成中间代码,Python程序运行时是从模块顶行开始,逐行进行翻译执行,所以,最顶层(没有被缩进)的代码都会被执行,所以Python中并不需要一个统一的main()作为程序的入口。当哪个模块被直接执行时,该模块“__name__”的值就是“__main__”,当被导入另一模块时,“__name__”的值就是模块的真实名称[1]。通俗来说,这就是一个if语句,如果所运行的是这个语句所在的python程序,后面的内容将会被执行,如果是作为导入模块的话,将不会被执行。

2.如何input一个一维列表?写的过程中,我本能的写成了nums=list(input( )),后来意识到,这仅仅是将所写入的数字变成了list格式,并不是储存在list列表中,应该采用for循环的格式将输入的每一个数字存储到列表中。

arr=input('以空格为间隔连续输入一个数组')
nums = [int(n) for n in arr.split()]

       采用上图所示的方法将数组输入,其中使用到str.split()方法,split() 方法可以实现将一个字符串按照指定的分隔符切分成多个子串,并将这些子串保存到列表中(不包含分隔符),作为方法的返回值反馈回来,str.split()方法基本语法格式为:

str.split(sep,maxsplit)

其中,

str:表示要进行分割的字符串,

sep:用于指定分隔符,可以包含多个字符。此参数默认为 None,表示所有空字符,包括空格、换行符“\n”、制表符“\t”等;

maxsplit:可选参数,用于指定分割的次数,最后列表中子串的个数最多为 maxsplit+1。如果不指定或者指定为 -1,则表示分割次数没有限制;

3.去掉力扣(LeetCode)中的假设“只会存在一个有效答案”怎么写?答案如下(就在记录笔记的现在,我又想到如果列表中有相同的数字应该如何处理,可能太多就不一一陈述)上述解法时间复杂度为O(N^2),空间负责度为O(1):

    def twoSum(self):
        a=[]
        n=len(self.nums)
        for i in range(n):
            for j in range(i+1,n):
                if(self.nums[i]+self.nums[j]==self.target):
                    a.append (str(i)+'与'+str(j))
        if(len(a)!=0):
            return a
        else:
            return('没有两个数相加等于target')

4.使用字典来优化算法

在使用字典优化算法之前,需要介绍一个Python的内置函数enumerate() 函数,enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中[2]。

enumerate() 函数的基本语法格式:enumerate(sequence, [start=0])

其中,sequence : 一个序列、迭代器或其他支持迭代对象 ;   start : 下标起始位置

seq = ['one', 'two', 'three']
for i, element in enumerate(seq):
    print(i,element)

在做力扣(LeetCode)第一题——两数之和时碰到的问题与解决办法

了解enumerate()函数后,可以创建字典来查询,思路为:首先创建一个空字典,然后从输入的nums数组第一个开始插入,并从第二个数开始查询,已经插入的数字中是否存在与target-num(num计为当前nums的某一个数),如果有则返回该数对应的位置,在字典中,key对应的是数组的值,value对应的是数组的位置。代码如下[3],本次算法的空间和时间复杂度都是时间复杂度:O(N):

    def twoSum(self):
        hashmap = {}
        for i, num in enumerate(nums):
            if hashmap.get(target - num) is not None:
                print(hashmap.get(target - num))
                return [i, hashmap.get(target - num)]
            hashmap[num] = i

 

本人只是一个python小白,没有系统地学习过python,正处于学习阶段,本帖只用于记录自己的问题和成长,如果有幸被你看见,且刚好对你有用,是我的荣幸,如果有写错的地方,欢迎大佬们批评指正。

[1]:https://www.cnblogs.com/chenhuabin/p/10118199.html

[2]https://www.runoob.com/python/python-func-enumerate.html

[3]https://leetcode-cn.com/problems/two-sum/solution/xiao-bai-pythonji-chong-jie-fa-by-lao-la-rou-yue-j/

 

上一篇:Python中的迭代(Iteration)


下一篇:python中enumerate函数