Letcode刷题总结知识点
1、二叉树+链式存储+递归操作
https://www.jianshu.com/p/9503238394df
现序遍历,中序遍历,后序遍历取决于根节点,根节点现访问,在左右,;中序就是现访问左边子树的叶子结点,访问根节点,访问右子树。后序遍历就是最后访问根节点
self调用参数递归问题:
python方法函数中的self关键字
上面执行"a.foo(1)"语句时有个报错,说只需要一个参数,但是给了两个参数,这第二个参数是怎么来的,为什么A.foo(1)就不会出错。这里我们可以引出python类中的方法函数,方法函数指的是通过类的实例化对象调用的函数,方法函数的第一个形参表示类的实例化对象,通常写成self。执行a.foo(1)时就相当于执行A.foo(a,1),因为A.foo()中只有一个形参,传入的参数多于需要的参数,所以发生类型错误。
我们在A的定义中重新定义foo:
class A:
def foo(self, n):
print(n+1)
a = A()
1
2
3
4
5
现在我们在a中调用foo就不会有问题了:
https://blog.csdn.net/m0_38063172/article/details/82220501
2、
Python基础知识:
https://www.runoob.com/python3/python3-examples.html
python 队列操作:
class Queue(object):
def __init__(self):
self.__list = []
def enqueue(self,item):
# ���
#β�����ӣ�ͷ������
self.__list.append(item)
#ͷ�����ӣ�β������
# self.__list.insert(0,item)
def dequeue(self):
#����
return self.__list.pop(0)
# return self.__list.pop()
def is_empty(self):
#�ж��Ƿ�Ϊ��
return self.__list == []
def size(self):
#�жϴ�С
return len(self.__list)
class Queue2(object):
def __init__(self,size):
self.__list = []
self.head = -1
self.tail = -1
self.size = size
def enqueue(self,item):
# ���
#β�����ӣ�ͷ������
if self.full():
print("quene is full")
else:
self.__list.append(item)
self.tail = self.tail + 1
#ͷ�����ӣ�β������
# self.__list.insert(0,item)
def dequeue(self):
#����
if self.is_empty():
print("enquenu is empty")
else:
self.head = self.head + 1
return self.__list.pop(0)
# return self.__list.pop()
def is_empty(self):
#�ж��Ƿ�Ϊ��
if self.head == self.tail:
return True
else:
return False
def full(self):
if self.tail - self.head+1 == self.size:
return True
else:
return False
def size(self):
#�жϴ�С
return len(self.__list)
class Queue3(object):
def __init__(self,n):
self.__list = [None]*(n+1)
self.head = 0
self.tail = 0
self.size = 0
def enqueue(self,e):
#入队
if self.full():
self.resize(self.get_capaticty() * 2) # 如果队列满,以当前队列容积的2倍进行扩容
self.__list[self.tail] = e
self.tail = (self.tail+1) % len(self.__list)
self.size += 1
def dequeue(self):
if self.is_empty():
raise Exception("Cannot dequeue from en empty queue")
result = self.__list[self.head]
self.__list[self.head] = None
self.head = (self.head+1) % len(self.__list)
self.size -= 1
# 如果元素个数少于容积的1/4并且元素个数
if self.size < self.get_capaticty() // 4 and self.get_capaticty() > 1:
self.resize(self.get_capaticty() // 2)
return result
def is_empty(self):
#判断队列是否为空
return self.size == 0
def get_capaticty(self):
# 获取队列容积(实际可存储元素个数)
return self.__len__() - 1
def full(self):
#判断队列是否为满
return (self.tail+1)% len(self.__list) == self.head
def __str__(self):
return str(self.__list)
def __len__(self):
return len(self.__list)
def __iter__(self):
return iter(self.__list)
def get_size(self):
# 获取队列元素个数
return self.size
def get_capaticty(self):
# 获取队列容积(实际可存储元素个数)
return self.__len__() - 1
def get_head(self):
# 获取队首
return self.__list[self.head]
def resize(self, new_capacity):
new_arr = [None] * (new_capacity+1)
for i in range(self.size):
new_arr[i] = self.__list[(i+self.head) % len(self.__list)]
self.__list = new_arr
self.head = 0
self.tail = self.size
import datetime
if __name__ == '__main__':
loop_queue = Queue3(10)
# s.enqueue(1)
# s.enqueue(2)
# s.enqueue(3)
# print(s.dequeue())
# print(s.dequeue())
# print(s.dequeue())
start_time = datetime.datetime.now()
for i in range(5000000):
loop_queue.enqueue(i)
print('---------测试----------')
print('Loop_Queue: size = {0} , capacity = {1}\n'.format(loop_queue.get_size(), loop_queue.get_capaticty()), loop_queue)
print('is_empty:', loop_queue.is_empty())
print('is_full:', loop_queue.full())
for i in range(5000000):
loop_queue.dequeue()
last_time = datetime.datetime.now() - start_time
print('\n---------测试dequeue----------')
print('Loop_Queue: size = {0} , capacity = {1}\n'.format(loop_queue.get_size(), loop_queue.get_capaticty()),
loop_queue)
print('is_empty:', loop_queue.is_empty())
print('is_full:', loop_queue.full())
print('Loop_Queue epertate time', last_time)
2、
744. 寻找比目标字母大的最小字母
给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母。
在比较时,数组里字母的是循环有序的。举个例子:
- 如果目标字母
target = 'z'并且有序数组为letters = ['a', 'b'],则答案返回'a'。 - 如果目标字母
target = 'n'并且有序数组为letters = ['m', 'z', 'c', 'f', 'j'],则答案返回'z'。
示例:
输入: letters = ["c", "f", "j"] target = "a" 输出: "c" 输入: letters = ["c", "f", "j"] target = "c" 输出: "f" 输入: letters = ["c", "f", "j"] target = "d" 输出: "f" 输入: letters = ["c", "f", "j"] target = "g" 输出: "j" 输入: letters = ["c", "f", "j"] target = "j" 输出: "c" 输入: letters = ["c", "f", "j"] target = "k" 输出: "c"
解法1、
244ms
解题2:
136ms
156ms
69. x 的平方根
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4 输出: 2
示例 2:
输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
二分查找
167. 两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值index1 和 index2,其中 index1 必须小于 index2。
说明:
- 返回的下标值(index1 和 index2)不是从零开始的。
- 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
浙公网安备 33010602011771号