Python每日一练(20230501) 链表排序、平衡二叉树、素数对

简介: Python每日一练(20230501) 链表排序、平衡二叉树、素数对

1. 对链表进行插入排序

对链表进行插入排序。

插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。

每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。


插入排序算法:

   插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。

   每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。

   重复直到所有输入数据插入完为止。


示例 1:

输入: 4->2->1->3

输出: 1->2->3->4


示例 2:

输入: -1->5->3->4->0

输出: -1->0->3->4->5


出处:

https://edu.csdn.net/practice/26912045

代码:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
def insertionSortList(head: ListNode) -> ListNode:
    dummy = ListNode(float('-inf'), head)
    tail = dummy
    cur = head
    while cur:
        if tail.val <= cur.val:
            # 若链表尾节点值小于等于当前节点,不需要移动
            tail.next = cur
            tail = cur
            cur = cur.next
        else:
            # 在已排序部分找到插入位置
            prev = dummy
            while prev.next.val < cur.val:
                prev = prev.next
            # 插入节点
            tail.next = cur.next
            cur.next = prev.next
            prev.next = cur
            cur = tail.next
    return dummy.next
def createList(lst):
    head = ListNode(lst[0])
    p = head
    for i in lst[1:]:
        node = ListNode(i)
        p.next = node
        p = p.next
    return head
def traversalList(head):
    while head:
        print(head.val, end="->")
        head = head.next
    print("nill")
#%%
lst1 = [4, 2, 1, 3]
lst2 = [-1, 5, 3, 4, 0]
head1 = createList(lst1)
traversalList(head1)
sorted_head1 = insertionSortList(head1)
traversalList(sorted_head1)
head2 = createList(lst2)
traversalList(head2)
sorted_head2 = insertionSortList(head2)
traversalList(sorted_head2)

输出:

4->2->1->3->nill

1->2->3->4->nill

-1->5->3->4->0->nill

-1->0->3->4->5->nill


2. 平衡二叉树


给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

341009251c7788edc838975732064bf1-1.jpeg


输入:root = [3,9,20,null,null,15,7]

输出:true


示例 2:

bce64ca4c0e80b345a5a286122112851.jpeg


输入:root = [1,2,2,3,3,null,null,4,4]

输出:false


示例 3:

输入:root = []

输出:true

提示:

   树中的节点数在范围 [0, 5000] 内

   -10^4 <= Node.val <= 10^4


出处:

https://edu.csdn.net/practice/26912046

代码:

# 定义二叉树节点
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
class Solution(object):
    def isBalanced(self, root):
        if not root:
            return True
        left_depth = self.get_depth(root.left)
        right_depth = self.get_depth(root.right)
        if abs(left_depth - right_depth) > 1:
            return False
        else:
            return self.isBalanced(root.left) and self.isBalanced(root.right)
    def get_depth(self, root):
        if root is None:
            return 0
        else:
            return max(self.get_depth(root.left), self.get_depth(root.right)) + 1
def listToTree(lst):
    if not lst:
        return None
    root = TreeNode(lst[0])
    queue = [root]
    i = 1
    while i < len(lst):
        node = queue.pop(0)
        if lst[i] is not None:
            node.left = TreeNode(lst[i])
            queue.append(node.left)
        i += 1
        if i < len(lst) and lst[i] is not None:
            node.right = TreeNode(lst[i])
            queue.append(node.right)
        i += 1
    return root
# %%
s = Solution()
null = None
nums = [3,9,20,null,null,15,7]
root = listToTree(nums)
print(s.isBalanced(root))
nums = [1,2,2,3,3,null,null,4,4]
root = listToTree(nums)
print(s.isBalanced(root))

输出:

True

False


3. 找出素数对


任意输入一个大于10的偶数,编程找出所有和等于该偶数的素数对


以下程序实现了这一功能,请你填补空白处内容:

```python

h = 0
def a(h):
    x = 0
    for j in range(2, h):
        if h % j == 0:
            x = 1
            break
    if x == 0:
        return 1
n = int(input("输入任意大于10的偶数:"))
for i in range(n,n+1):
    h = 0
    if i % 2 == 0:
        for k in range(2, i):
            if a(k) == 1 and a(i - k) == 1:
                ________________;
```


出处:

https://edu.csdn.net/practice/26912047

代码:

def a(h):
    if h < 2:
        return 0
    x = 0
    for j in range(2, h):
        if h % j == 0:
            x = 1
            break
    if x == 0:
        return 1
n = int(input("输入任意大于10的偶数:"))
prime_pairs = []
for i in range(n, n+1):
    h = 0
    if i % 2 == 0:
        for k in range(2, i):
            if a(k) == 1 and a(i - k) == 1:
                prime_pairs.append((k, i - k))
print(prime_pairs)


输出:

输入任意大于10的偶数:100

[(3, 97), (11, 89), (17, 83), (29, 71), (41, 59), (47, 53), (53, 47), (59, 41), (71, 29), (83, 17), (89, 11), (97, 3)]



目录
相关文章
|
2月前
|
索引 Python
【Leetcode刷题Python】328. 奇偶链表
在不使用额外空间的情况下,将链表中的奇数和偶数索引节点重新排序的方法,并提供了相应的Python实现代码。
30 0
|
2月前
|
Python
【Leetcode刷题Python】25.K 个一组翻转链表
解决LeetCode "K 个一组翻转链表" 问题的三种方法:使用栈、尾插法和虚拟节点顺序法,并提供了每种方法的Python实现代码。
27 0
|
2月前
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
23 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
42 5
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
33 4
|
2月前
|
存储 Python
【Leetcode刷题Python】23. 合并K个升序链表
合并K个升序链表的方法:使用数组排序的暴力求解法、使用小顶堆的高效方法,以及分而治之的策略,并提供了相应的Python实现代码。
16 1
|
2月前
|
Python
【Leetcode刷题Python】138. 复制带随机指针的链表
LeetCode上题目“138. 复制带随机指针的链表”的Python解决方案,包括两种方法:一种是在每个节点后复制一个新节点然后再分离出来形成新链表;另一种是构建一个字典来跟踪原始节点与其副本之间的映射关系,从而处理新链表的构建。
15 1
|
2月前
|
Python
【Leetcode刷题Python】234.回文链表
两种判断链表是否为回文的方法:使用栈和拆分为两个链表后反转对比,并给出了相应的Python代码实现。
17 0
|
2月前
|
Python
【Leetcode刷题Python】203.移除链表元素
文章提供了三种删除链表中特定值节点的方法:迭代法、虚拟节点迭代删除法和递归法,并给出了相应的Python实现代码。
17 0
|
2月前
|
Python
【Leetcode刷题Python】92.反转链表II
LeetCode上题目“92. 反转链表 II”的Python解决方案,其中包括两种方法:一种是头插法,另一种是迭代法。迭代法涉及先截取链表的一部分,然后反转这部分链表,最后将反转后的部分重新连接到原链表中。
15 0
下一篇
无影云桌面