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)
了解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