目录
- 一、Leetcode189轮转数组
- 题目描述
- 解题思路
- 方法:切片
- 总结
- 二、Leetcode56合并区间
- 题目描述
- 解题思路
- 方法:
- 总结
- 三、Leetcode21合并两个有序链表
- 题目描述
- 解题思路
- 方法:
- 总结
- 四、Leetcode2两数相加
- 题目描述
- 解题思路
- 方法:
- 总结
- sql总结:
一、Leetcode189轮转数组
题目描述
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
题目链接:力扣题目链接
解题思路
- 切片思想
方法:切片
- 因为轮转后切片内顺序不变
- 将区间调转位置[-k:],[:-k]
- !!!当k大于数组长度的时候,要取余
class Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not return anything, modify nums in-place instead."""# 当k大于数组长度时k = k % len(nums)n1 = nums[-k:]n2 = nums[: -k]nums[:] = n1 + n2
总结
- 切片思想非常好用
- 轮转的时候注意k的大小
- 注意语法[ : ] = [ :-k] + [-k: ]
二、Leetcode56合并区间
题目描述
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
题目链接:力扣题目链接
解题思路
- 合并区间,比较上一个区间的右区间和下一个区间的左区间
方法:
- 先排序
- 判断加入区间/更新区间的条件
- 加入区间:
merge为空,上一个区间的右区间小于下一个区间的左区间[1,3],[4,5] - 更新区间:
上一个区间的右区间大于下一个区间的左区间
!!!更新右区间=这两个区间右区间的最大值
class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:# 根据每个区间的左区间进行排序intervals.sort(key = lambda x: x[0])merge = []for i in intervals:if not merge or merge[-1][1] < i[0]:merge.append(i)else:merge[-1][1] = max(merge[-1][1], i[1])return merge
总结
- 二维数组排序
s.sort(key = lambda x: x[0]) - 多列几个例子就知道合并的逻辑了
三、Leetcode21合并两个有序链表
题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
题目链接:力扣题目链接
解题思路
- 比合并区间简单,链表合并只用比大小
- 小的加入,剩的加入
方法:
- 新建一个空节点dummy,用merge遍历,最终返回dummy.next
- 当两个链表节点都存在时,哪个小就连上哪个
- 当只剩一个链表时,将剩下的链表之间连过来
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:dummy = ListNode()merge = dummycur1 = list1cur2 = list2while cur1 and cur2:if cur1.val <= cur2.val:merge.next = cur1cur1 = cur1.nextelse:merge.next = cur2cur2 = cur2.nextmerge = merge.next# 剩余节点直接连过来if cur1:merge.next = cur1else:merge.next = cur2return dummy.next
总结
- 剩余链表可以通过节点之间连过来
if cur1:
merge.next = cur1
四、Leetcode2两数相加
题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
题目链接:力扣题目链接
解题思路
- 注意存储进位的值
方法:
- while循环只要有一个链表没走完就继续走,走完的为0
- 注意最后如果还有进位,要用merge.next存完!!!
# 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]:cur1 = l1cur2 = l2dummy = ListNode()merge = dummypre = 0while cur1 or cur2:val1 = cur1.val if cur1 else 0val2 = cur2.val if cur2 else 0total = val1 + val2 + pre# 处理进位pre = total // 10merge.next = ListNode(total % 10)merge = merge.next# 移动到下一个节点if cur1:cur1 = cur1.nextif cur2:cur2 = cur2.nextif pre:merge.next = ListNode(pre)return dummy.next
总结
-
新建链表都是:
dummy = ListNode()
merge = dummy
用merge.next继续走,最终返回dummy.next -
进位值等于pre // 10
-
注意最终剩下的进位也要用merge.next存!!!
sql总结:
-
sql中 值的比较用=
where id % 2 = 1 -
日期范围用between…and…
activity_date between “2019-06-28” and “2019-07-27”
心得:就算是春招也要坚持刷算法~!!缓解焦虑就刷力扣!!虽然刷的慢,但希望刷过的算法都会用!!!