leetcode开始刷

1.两数之和

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
           for j in range(len(nums)):
               if i != j:
                   if nums[i]+nums[j]==target:
                     return [i,j]

改善

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            res= target-nums[i]
            if res in nums[i+1:]:
                j=nums[i+1:].index(res)
                return[i,i+1+j]

学习哈希表

哈希表时间复杂度O(1)

通过一个字符串得到一个数值

要求1.一致性        2.不同字符串映射为不同数值

Hash Table 

子串和子序列的区别

2 子串-substring
关键词:连续

子串定义:子串,计算机术语,串中任意个连续的字符组成的子序列称为该串的子串。

下面举几个例子:

ab的子串:a、b、ab、/0(空串)共4个即(2+1+1)个,
abc的子串:a、 b、 c、 ab、 bc 、abc、/0共(3+2+1+1)个,

所以若字符串的长度为n, 则子串的个数就是[n(n+1)/2+1]个,*

3 子序列-subsequence
关键词:任意地选取,即不用连续

字符串

空格也是字符串

1.字符串索引和切片:            索引    正向递增序号和反向递减序号

s='hallo'

s[0]        输出 h

s[-3]         输出 l

切片

 比如字符串

s='hallo world'

s[::-1]        输出dlrow ollah

s[0:5:1]        输出hallo

s[4:10:2]        输出 owrd

2.字符串的函数
  1. len(x) #返回字符串x的长度

  2. str(x) #将任意类型的x转化为字符串类型

  3. chr(x) #返回Unicode编码为x的字符

  4. ord(x) #返回字符x的Unicode编码

  5. hex(x) #将整数x转化为十六进制数

  6. oct(x) #将整数x转化为八进制数

   find()   #查找一个字符串在另一个字符串指定范围内(默认是整个字符串)中首次出现的位置,若不存在则返回-1
rfind()  #查找一个字符串在另一个字符串指定范围内(默认是整个字符串)中最后一次出现的位置,若不存在则返回-1
index()  #查找一个字符串在另一个字符串指定范围内(默认是整个字符串)中首次出现的位置,若不存在则抛出异常
rindex() #查找一个字符串在另一个字符串指定范围内(默认是整个字符串)中最后一次出现的位置,若不存在则抛出异常
count()  #用来返回一个字符串在另一个字符串中出现的次数,若不存在则返回0


 i = max(dic[s[j]], i) # 更新左指针 i

第2题无重复的最大子串

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        dic,res,i = {}, 0, -1
        for j in range(len(s)):
            if s[j] in dic:
                i = max(dic[s[j]],i)
            dic[s[j]] =j
            res = max(res, j - i) # 更新结果
        return res

第88题

 合并两个有序数组

1.函数sort()是对列表就地排序

>>> x=[8,9,0,7,4,5,1,2,3,6]
>>> x.sort()
>>> print(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 

2.函数sort()修改序列,不返回任何值

>>> x=[8,9,0,7,4,5,1,2,3,6]
>>> y=x.sort()
>>> print(y)
None
>>> print(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 

3.sorted()函数会返回一个排序列表,不改变原有序列

>>> x=[8,9,0,7,4,5,1,2,3,6]
>>> y=sorted(x)
>>> print(y)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print(x)
[8, 9, 0, 7, 4, 5, 1, 2, 3, 6]

4.函数sort()是升序排序,如何降序排序,需要用到函数reverse()

>>> x=[8,9,0,7,4,5,1,2,3,6]
>>> x.sort()
>>> x.reverse()
>>> print(x)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

5.函数sort()排序的高级用法

方法sort()可以接受两个参数sort(key,reverse)

(1) key参数
key接受的是一个只有一个形参的函数

key接受的函数返回值,表示此元素的权值,sort将按照权值大小进行排序

>>> x=[8,9,0,7,4,5,1,2,3,6]
>>> def size(a):
>>>     x=10-int(a)
>>>     return x
>>> x.sort(key=size)
>>> print(x)

[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

(2) reverse参数
reverse接受的是一个bool类型的值 (Ture or False),表示是否颠倒排列顺序,一般默认的是False,注意第一个字母是大写的

>>> x=[8,9,0,7,4,5,1,2,3,6]
>>> x.sort(reverse=True)
>>> print(x)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> x.sort(reverse=False)
>>> print(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        i =0
        
        
        while i <= len(nums):
            if val == nums[i]:
                nums.pop(i)

            i +=1
        return len(nums)
            

第4题最长回文子串

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        i =0
        
        
        while i <= len(nums):
            if val == nums[i]:
                nums.pop(i)

            i +=1
        return len(nums)
            

下面的a = [1,2,3,4,5]

[-1]: 列表最后一项
在这里插入图片描述
[:-1]: 从第一项到最后一项
原型是[n : m],前闭后开,索引从零开始,第一个索引指定可以取到,即n可以取到,后一个索引不可取到,即m不可取到。
在这里插入图片描述
[::-1]: 代表从全列表倒序取

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort()
        ans = [intervals[0]]
        for s,e in intervals[1:]:
            if ans[-1][1] < s:
                ans.append([s,e])
            else:
                ans[-1][1] = max(ans[-1][1],e)
        return ans

链表node

链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item和指向下一个节点的指针next.

class Node(objiect):
    def _init_(self,item)
        self.item =item
        self.next = None

创建链表

头插法在头节点插入head

尾插法tail

链表的插入删除        

p.next = curNode.next

curNode.next=p

删除

curNode.next=p.next

del p 

双链表;每个节点有两个指针

p.next = curNode.next
curNode.next.prior = p
p.prior =curNode
curNode.next=p

备注: 在 Python 中,and 和 or 都有提前截至运算的功能。

and:如果 and 前面的表达式已经为 False,那么 and 之后的表达式将被 跳过,返回左表达式结果
or:如果 or 前面的表达式已经为 True,那么 or 之后的表达式将被跳过,直接返回左表达式的结果
例子:[] and 7 等于 []

第合并两个有序列表


class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        if list1 is None or list2 is None:
            return list1 or list2
        if list1.val <= list2.val:
            list1.next = self.mergeTwoLists(list1.next, list2)
            return list1
        else:
            list2.next = self.mergeTwoLists(list1, list2.next)
            return list2

双指针的快慢指针

第10题 两数相加 leetcode为第二题

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        i=0
        head = l3 =ListNode(None)
        while l1 or l2 or i :
            i = (l1.val if l1 else 0) +(l2.val if l2 else 0) +i
            l3.next =ListNode(i%10)
            i=i//10
            l1 = l1.next if l1 else None
            l3 =l3.next
            l2 = l2.next if l2 else  None
        return head.next

贪心算法

求解优化问题的一类算法

最(多,少,长,短)

步骤

遍历备选的元素

贪心策略确定选择一个元素

决策过程

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

Python 2.3. 以上版本可用,2.6 添加 start 参数。

语法

以下是 enumerate() 方法的语法:

enumerate(sequence, [start=0])

参数

  • sequence -- 一个序列、迭代器或其他支持迭代对象。
  • start -- 下标起始位置的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值