1. 按要求补齐数组
给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n]
区间内选取任意个数字补充到 nums 中,使得 [1, n]
区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。
示例 1:
输入: nums = [1,3], n = 6
输出: 1
解释:
根据 nums 里现有的组合 [1], [3], [1,3],可以得出 1, 3, 4。
现在如果我们将 2 添加到 nums 中, 组合变为: [1], [2], [3], [1,3], [2,3], [1,2,3]。
其和可以表示数字 1, 2, 3, 4, 5, 6,能够覆盖 [1, 6] 区间里所有的数。
所以我们最少需要添加一个数字。
示例 2:
输入: nums = [1,5,10], n = 20
输出: 2
解释: 我们需要添加 [2, 4]。
示例 3:
输入: nums = [1,2,2], n = 5
输出: 0
出处:
https://edu.csdn.net/practice/23718834
代码:
from typing import List class Solution: def minPatches(self, nums: List[int], n: int) -> int: count = 0 miss = 1 idx = 0 while miss <= n: if idx < len(nums) and nums[idx] <= miss: miss += nums[idx] idx += 1 else: count += 1 miss += miss return count # %% s = Solution() print(s.minPatches(nums = [1,3], n = 6)) print(s.minPatches(nums = [1,5,10], n = 20)) print(s.minPatches(nums = [1,2,2], n = 5))
输出:
1
2
0
2. 重排链表
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入: head = [1,2,3,4]
输出: [1,4,2,3]
示例 2:
输入: head = [1,2,3,4,5]
输出: [1,5,2,4,3]
提示:
- 链表的长度范围为
[1, 5 * 10^4]
1 <= node.val <= 1000
出处:
https://edu.csdn.net/practice/23718835
代码:
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class LinkList: def __init__(self): self.head=None def initList(self, data): self.head = ListNode(data[0]) r=self.head p = self.head for i in data[1:]: node = ListNode(i) p.next = node p = p.next return r def convert_list(self,head): ret = [] if head == None: return node = head while node != None: ret.append(node.val) node = node.next return ret class Solution(object): def reorderList(self, head): """ :type head: ListNode :rtype: None Do not return anything, modify head in-place instead. """ if not head: return stack = [] s = head while s.next: stack.append(s.next) s = s.next s = head n = 0 while stack: if n % 2 == 0: one = stack.pop() else: one = stack.pop(0) one.next = None s.next = one s = s.next n += 1 # %% l = LinkList() list1 = [1,2,3,4] list2 = [1,2,3,4,5] s = Solution() head = l.initList(list1) print(l.convert_list(head)) s.reorderList(head) print(l.convert_list(head)) head = l.initList(list2) print(l.convert_list(head)) s.reorderList(head) print(l.convert_list(head))
输出:
[1, 2, 3, 4]
[1, 4, 2, 3]
[1, 2, 3, 4, 5]
[1, 5, 2, 4, 3]
3. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
出处:
https://edu.csdn.net/practice/23718836
代码:
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class LinkList: def __init__(self): self.head=None def initList(self, data): self.head = ListNode(data[0]) r=self.head p = self.head for i in data[1:]: node = ListNode(i) p.next = node p = p.next return r def convert_list(self,head): ret = [] if head == None: return node = head while node != None: ret.append(node.val) node = node.next return ret class Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: lrr = l1 while True: l1.val = l1.val + l2.val if l1.next is None and l2.next is None and l1.val < 10: break if l1.next is None: l1.next = ListNode(0) if l2.next is None: l2.next = ListNode(0) if l1.val >= 10: l1.val = l1.val - 10 l1.next.val += 1 l1 = l1.next l2 = l2.next return lrr # %% l = LinkList() list1 = [2,4,3] list2 = [5,6,4] l1 = l.initList(list1) l2 = l.initList(list2) s = Solution() print(l.convert_list(s.addTwoNumbers(l1, l2))) list1 = [9,9,9,9,9,9,9] list2 = [9,9,9,9] l1 = l.initList(list1) l2 = l.initList(list2) print(l.convert_list(s.addTwoNumbers(l1, l2)))
输出:
[7, 0, 8]
[8, 9, 9, 9, 0, 0, 0, 1]