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)]



目录
相关文章
|
6月前
|
存储 Python
Python 中链表的个人理解
简介:本文介绍了Python中链表的基本组成及其操作实现。链表由`head`(头节点)、中间节点和`tail`(尾节点)三部分构成,每个节点通过`Node`类定义,包含`value`(值域)和`next`(指针域)。示例代码展示了链表的增删查功能,包括`add`(头部插入)、`append`(尾部插入)、`remove`(删除节点)、`search`(查找节点)及遍历方法。运行结果验证了链表操作的正确性。
|
8月前
|
存储 Python
Python 实现单向链表,和单向链表的反转
链表是一种数据结构,每个节点存储相邻节点的位置信息。单链表中的节点仅存储下一节点的位置。通过Python实现单链表,定义`ListNode`类并关联节点可创建链表。例如,创建A-&gt;B-&gt;C的链表后,可通过反转函数`reverse`将链表反转为CBA。代码展示了如何实现和操作单链表。
176 6
Python 实现单向链表,和单向链表的反转
|
10月前
|
Python
Python-素数
本文介绍了如何使用 Python 判断素数,并通过具体示例展示了求 100 以内及自定义范围内所有素数的方法。内容包括素数的定义、判断素数的底层逻辑和步骤,以及详细的代码演示。适合初学者参考学习。
|
索引 Python
【Leetcode刷题Python】328. 奇偶链表
在不使用额外空间的情况下,将链表中的奇数和偶数索引节点重新排序的方法,并提供了相应的Python实现代码。
124 0
|
8月前
|
存储 算法 搜索推荐
Python 实现反转、合并链表有啥用?
大家好,我是V哥。本文介绍Python实现反转链表和合并链表的应用场景及代码实现。反转链表适用于时间序列数据展示、回文链表判断等;合并链表则用于大规模数据排序、数据库查询结果集合并等。通过迭代和递归方法实现反转链表,以及合并两个或多个有序链表的算法,帮助开发者解决实际问题。关注V哥,了解更多实用编程技巧。 先赞再看后评论,腰缠万贯财进门。
151 0
|
9月前
|
Python
探索 Python 中链表的实现:从基础到高级
链表是一种由节点组成的基础数据结构,每个节点包含数据和指向下一个节点的引用。本文通过Python类实现单向链表,详细介绍了创建、插入、删除节点等操作,并提供示例代码帮助理解。链表在处理动态数据时具有高效性,适用于大量数据变动的场景。文章为初学者提供了全面的入门指南,助你掌握链表的核心概念与应用。
451 0
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
112 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
164 5
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
147 4
|
存储 Python
【Leetcode刷题Python】23. 合并K个升序链表
合并K个升序链表的方法:使用数组排序的暴力求解法、使用小顶堆的高效方法,以及分而治之的策略,并提供了相应的Python实现代码。
147 1

热门文章

最新文章

推荐镜像

更多