zoukankan      html  css  js  c++  java
  • 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}
    '.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('
    ---------测试dequeue----------')
        print('Loop_Queue: size = {0} , capacity = {1}
    '.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
    class Solution:
        def nextGreatestLetter(self, letters: List[str], target: str) -> str:
            t = 0
            for k in letters:
                if target < k:
                    t = 1
                    return k
            if t == 0:
                return letters[0]

    解题2:

    136ms

    class Solution:
        def nextGreatestLetter(self, letters: List[str], target: str) -> str:

            letters = sorted(set(letters))
            head = 0
            tail = len(letters)-1
            while True:
                if target < letters[head] or target >= letters[tail]:
                    return letters[head]
                if target == letters[head]:
                    return letters[head+1]
                if target == letters[(head+tail)//2]:
                    return letters[(head+tail)//2+1]
                if target > letters[(head+tail)//2]:
                    head = (head+tail)//2+1
                if target < letters[(head+tail)//2]:
                    tail = (head+tail)//2
    解答3:
    156ms
    class Solution:
        def nextGreatestLetter(self, letters, target):
            letters = sorted(list(set(letters+[target])))
            return letters[0if letters[-1] == target else letters[letters.index(target)+1]
     
     
     
     

    69. x 的平方根

    实现 int sqrt(int x) 函数。

    计算并返回 x 的平方根,其中 x 是非负整数。

    由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

    示例 1:

    输入: 4
    输出: 2
    

    示例 2:

    输入: 8
    输出: 2
    说明: 8 的平方根是 2.82842..., 
         由于返回类型是整数,小数部分将被舍去。
    

    二分查找
    class Solution:
        def mySqrt(self, x: int) -> int:
            head = 0
            tail = x
            while True:

                num = ((head + tail)//2)**2
                num2 = ((head + tail)//2 + 1)**2

                if num <= x < num2:
                    return (head + tail)//2
                if num < x <= num2:
                    return (head + tail)//2 + 1
                if x > ((head + tail)//2)**2:
                    head = (head + tail)//2 + 1
                if x < ((head + tail)//2)**2:
                    tail = (head + tail)//2
               

    167. 两数之和 II - 输入有序数组

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

    函数应该返回这两个下标值index1 和 index2,其中 index1 必须小于 index2

    说明:

    • 返回的下标值(index1 和 index2)不是从零开始的。
    • 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

    示例:

    输入: numbers = [2, 7, 11, 15], target = 9
    输出: [1,2]
    解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
    通过次数80,632提交次数151,493
     
    class Solution:
        def twoSum(self, numbers: List[int], target: int) -> List[int]:
            n = len(numbers)

            i = 0
            j = n - 1
            while i < j:
                sumres = numbers[i] + numbers[j]
                if sumres == target:
                    return [i+1, j+1]
                elif sumres > target:
                    j -= 1
                else:
                    i += 1
    对碰法
     
    https://blog.csdn.net/qq_17550379/article/details/80512745
     
  • 相关阅读:
    phalcon: 当删除循环删除一组数据,需要判断影响的行affectedRows
    java:经典消费生成者
    java:同步和死锁
    java: Thread 和 runnable线程类
    git: windows git ssh keys生成
    ​'JAVAC' 不是内部或外部命令解决方法,记得要重启cmd
    java jar包解析:打包文件,引入文件
    php 对多维数组排序array_multisort
    appium入门基础
    中文Appium API 文档
  • 原文地址:https://www.cnblogs.com/xinghaiyige/p/12507219.html
Copyright © 2011-2022 走看看