题目46

# 画一个正方形
# 随便一搜,就有相关的库,这里使用tkinter库
# 使用tkinter库
from tkinter import *

# 使用画布控件 Canvas,创建一个画布
# Canvas的参数很多:我们用其中的width height bg(background)
canvas = Canvas(width=800, height=600, bg='green')
canvas.pack()
# 直接用四个点来确认一个正方形,就是画四条线
points = (100,200,200,200,200,300,100,300,100,200)
canvas.create_line(points, width=1,fill='pink')

# 用画矩形的方法
canvas.create_rectangle(400,500,500,600,fill='yellow')
mainloop()  # 这个是必须的,没有这个就没有窗口

题目47

# 画一个椭圆
# 随便一搜,就有相关的库,这里使用tkinter库
# 使用tkinter库
from tkinter import *

# 使用画布控件 Canvas,创建一个画布
# Canvas的参数很多:我们用其中的width height bg(background)
canvas = Canvas(width=800, height=600, bg='green')
canvas.pack()
# 直接用四个点来确认一个正方形,就是画四条线
canvas.create_oval(100,100,200,150,fill='purple')
mainloop()  # 这个是必须的,没有这个就没有窗口

题目48

# 输入一个数组,最大的与第一个交换,最小的与最后一个交换

# 第一种方法
nums = []
while True:
    try:
        elm = int(input("请输入一个数,输入其它非数字字符结束:\n"))
        nums.append(elm)
    except ValueError:
        print("当前已经输入的内容是:",nums)
        break


def func1(my_list:list):
    """找到数组中最小和最大的数字,然后分别将它们与最后一个和第一个元素交换

    Args:
        my_list (list): 传入需要被操作的列表
    """
    if not len(my_list):
        print("传入的列表中没有数据!!!")
        return None
    tmp = sorted(my_list)   # 默认是升序index=0的是最小的,index最大的是最大的
    index1 = my_list.index(tmp[-1])
    my_list[0], my_list[index1] = my_list[index1], my_list[0]

    index1 = my_list.index(tmp[0])
    my_list[-1], my_list[index1] = my_list[index1], my_list[-1]
nums1 = nums[:]
print("nums = ", nums)
func1(nums)
print("nums = ", nums)

# 第二种方法
def find_min_max(my_list:list):    # sourcery skip: avoid-builtin-shadow
    """先找到最小的,然后找最大的,把他们放入指定的位置
    Args:
        my_list (list): 查找的范围
    """
    def exchange_elm(my_list, arg1, arg2):
        result = my_list.index(arg1)
        my_list[arg2], my_list[result] = my_list[result], my_list[arg2]
        # print("my_list = ", my_list)
    
    if not len(my_list):
        print("传入的列表中没有数据!!!")
        return None
    list_min = min(my_list)
    list_max = max(my_list)
    # print("list_min = ", list_min)
    # print("list_max = ", list_max)
    
    exchange_elm(my_list, list_max, 0)
    exchange_elm(my_list, list_min, -1)

print("nums1 = ", nums1)     
find_min_max(nums1)    
print("nums1 = ", nums1)   

题目49

# 有n个整数,使其前面的各数向后移动m个位置,最后m个数字变成最前面的m个数
def listmove(my_list:list, m:int):
    """前面的各数向后移动m个位置,最后的m个数字变成最前面的m个数字
    Args:
        my_list (list): 待处理的列表
        m (int): 移动的位置
    """
    try:
        if len(my_list) < m:
            raise("参数m的值已经超过参数my_list的长度")
        
        # 前面的各个数字向后移动m
        my_list = my_list[len(my_list) - m:] + my_list[:len(my_list) - m]
        print("my_list = ", my_list)
        
        # 最后的m个数字变成最前面的m个数字
        for i in range(m):
            my_list[m + i],my_list[-m+i] = my_list[-m+i],my_list[m+i]
        return my_list
    except ValueError as ve:
        print(ve)

    return None

nums = [1,2,3,4,5,6]
print("nums = ", nums)
nums = listmove(nums,2)
print("nums = ", nums)
listmove(nums,10)

题目50

# 有n个人组成一个圈,顺序排号,从第一个开始报数,从第一个开始报数(1~3),凡报到3的人退出

# 关键信息1: 组成一个圈:如果第n个人报数2,那么第一个人就得报数3
# 关键信息2: 报数范围(1~3)
# 关键信息3: 报到3的人退出

# 过程分析 举例: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 如果下-个报数的是初始index最小那个,我们称为本轮结束,下一轮开始
# 原始index: 0 1 2 3 4 5 6 7 8 9
# 第一轮:    1 2 3 1 2 3 1 2 3 1    # 剔除原始index 2,5,8, 下一轮从2开始数
# 原始index: 0 1 3 4 6 7 9
# 第二轮:    2 3 1 2 3 1 2          # 剔除原始index 1 6, 下一轮从3开始
# 原始index: 0 3 4 7 9
# 第三轮:    3 1 2 3 1              # 剔除原始index 0 7, 下一轮从2开始
# 原始index: 3,4,9
# 第四轮:    2,3,1                  # 剔除原始index 4,下一轮从2开始
# 原始index: 3,9
# 第五轮:    2,3                    # 剔除掉原始index 9 ,下一轮从1开始
# 原始index: 3

# 第一种使用递归:
def pop_who_is_three(nums: list, begin: int, out_num: int = 3):
    print(f"left list = {nums}, current begin = {begin}")
    tmp = []
    if len(nums) < 2:
        return nums

    for x in nums:
        if begin % 3:
            tmp.append(x)

        begin += 1
        if begin > 3:
            begin = 1
    return pop_who_is_three(tmp, begin, out_num)

# 非递归
def pop_who_is_three1(nums: int):
    out_num = 3
    begin = 1
    tmp = nums[:]
    while True:
        nums1 = tmp[:]
        tmp.clear()
        if len(nums1) < 2:
            return nums1
        for x in nums1:
            if begin % 3:
                tmp.append(x)

            begin += 1
            if begin > 3:
                begin = 1


my_nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print("my_nums:", my_nums)
print(pop_who_is_three(my_nums.copy(), 1, 3))
print(pop_who_is_three1(my_nums))
# 输出
# my_nums: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# left list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], current begin = 1
# left list = [1, 2, 4, 5, 7, 8, 10], current begin = 2
# left list = [1, 4, 5, 8, 10], current begin = 3
# left list = [4, 5, 10], current begin = 2
# left list = [4, 10], current begin = 2
# left list = [4], current begin = 1
# [4]
# [4]
08-05 08:10