python 基础知识点(蓝桥杯python科目个人复习计划49)

今日复习内容:做复习题

例题1:希尔排序

题目描述:

希尔排序是直接插入排序算法的一种更高效的改进版本,但它是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出的改进方法之一:

1.插入排序在对几乎已经排好序的数据操作时,效果是非常好的。

2.插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。

而通常对于希尔排序中我们选择增量序列为:[N / 2],[N / 4],...,1,其中N为待排序数组的长度。

现在,给你一个整数数组,要求使用希尔排序算法对它进行排列。

输入格式:

第一行是一个整数n,表示整数数组的长度;

第二行包含n个空格分隔的整数a1,a2,...,an。

输出格式:

输出n个整数,即从小到大排序后的数组。

参考答案:

n = int(input())
li = list(map(int,input().split()))
gap = n // 2
while gap:
    for i in range(gap,n):
        value = li[i]
        j = i
        while j >= gap:
            if li[j - gap] > value:
                li[j] = li[j - gap]
                j -= gap

            else:
                break
        li[j] = value
    gap //= 2
print(*li)

运行结果:

以下是我对这道题的理解:

这个问题要求使用希尔排序算法对给定的整数数组进行排序。

希尔排序是插入排序的一种改进版本,它通过引入增量序列来减少插入排序中元素比较和交换的次数,从而提高排序效率。希尔排序的核心思想是先将整个待排序的记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行直接插入排序。

而希尔排序的增量序列是选择一个递减的序列,通常为N / 2,N / 4,...,1,其中N是待排序数组的长度。

首先,输出整数数组的长度和具体的数组内容。然后,初始化增量为数组长度的一半。接下来,通过一个while循环,不断缩小增量,直到增量为0。在循环中,对每个增量间隔进行插入排序。在插入排序中,从第一个增量间隔开始,将当前待插入的值与前面的值进行比较,依次向前移动元素,直到找到合适的位置插入。最后,输出排序后的数组。

n = int(input()):我们从标准输入中获取一个整数,表示整段数组的长度,将其赋值给变量n.

li = list(map(int,input().split())):接着,我们再从标准输入中读取一行,包含了空格分隔的整数,使用split()函数将其分隔成单独的数字字符串,并通过map()函数将这些字符串转换成整数,最后把它们组成一个列表并赋值给变量li,表示整数数组。

gap = n // 2 :然后,我们初始化增量gap为数组长度的一半。希尔排序中,我们会根据增量序列进行分组,首先选择一个较大的增量。

while gap:这里是一个while循环,只有增量gap不为0,就会一直执行排序

for i in range(gap,n):在每次循环中,我们使用for循环变量从gap开始到数组长度n的范围,这是为了对增量间隔进行排序。

value = li[i]:我们将当前待插入的值存储在变量value中,即当前增量间隔内需要插入到正确位置的元素

j = i:然后,我们将变量j初始化为当前位置i,从当前位置开始向前比较

while j >= gap and li[j -  gap] > value:这是一个while循环,它会在满足两个条件的情况下执行:

j >= gap:然后,确保我们没有越界访问数组;

li[j -  gap] > value:比较当前位置的前一个间隔增量的值是否大于待插入的值value,如果是,则需要向后移动元素。

li[j] = li[j - gap]:如果满足条件,我们将前一个间隔增量的值向后移动要给位置。

j -= gap:然后,我们将j向前移动 一个间隔增量,继续向前比较

li[j] = value:最后,我们将待插入的值value插入到正确的位置

gap //= 2:在内层循环结束后,我们将增量gap减半,以减少增量,这是希尔排序的一个重要步骤

print(*li):最后,我们使用print函数输出最后的数组,通过*li,我们将列表li中的元素拆包传递给print()函数,以便按照空格分隔输出数组元素。

通过对每个间隔增量进行插入排序,并在每轮排序或缩小增量,最终完成整个数组的排序。


例题2:图书排序

题目描述:

城市图书馆决定对其藏书进行重新分类。它们决定使用希尔排序作为其分类方法的基础,但是有一些特殊的要求。

图书馆的每本书都有一个独特的ID,范围从1到N。每本书还有一个权重值,表示其在库中的重要性。图书馆希望按照权重对图书进行排列,但是他们希望保留希尔排序的某些特性。

他们的要求如下:

1.使用希尔排序的增量序列:[N / 2],[N / 4],...,1。

2.当两本书的权重相同时,书籍ID较小的书应该出现在前面。

你的任务是根据这些要求,为图书馆排序这些藏书。

输入格式:

第一行,一个整数N,表示图书的数量。

接下来的N行,每行两个整数,分别是书籍的ID和权重,题目保证每本书的ID是唯一的。

输出格式:

输出N行,每行一个整数,按权重排序后的书籍ID。

参考答案:

n = int(input())
li = []
for i in range(n):
    li.append(list(map(int,input().split())))
gap = n // 2
while gap:
    for i in range(gap,n):
        value = li[i]
        j = i
        while j >= gap:
            if li[j - gap][1] > value[1]:
                li[j] = li[j - gap]
                j -= gap

            else:
                break
        li[j] = value
    gap //= 2
for i in li:
    print(i[0])

运行结果:

以下是我对代码的理解:

n = int(input()):首先,我们从标准输入中读取一个整数n,表示图书的数量,将其赋值给n

li = []:然后,我们初始化一个空列表li用来存储每本图书的信息。每个元素是一个包含两个整数的列表,分别表示书籍的ID和权重。

for i in range(n):接着,我们使用for循环遍历n次,读取每本书的ID和权重,并将其作为一个包含两个整数的列表添加到列表li中。

gap //= 2:初始化希尔排序的增量为数组长度n的一半

while gap:这是一个while循环,只要增量gap不为0,循环就会一直运行下去

for i in range(gap,n):在每次循环中,我们使用for循环遍历从增量gap开始到数组长度n的范围,这是为了对每个增量间隔进行插入排序

value = li[i]:我们将当前待插入的图书信息存储在变量value中,即当前增量间隔内需要插入到正确位置的书籍。

j = i:然后,我们把变量j初始为当前位置i,从当前位置开始向前比较

while j >= gap:这是一个while循环,它会在满足条件 j >= gap的情况下执行,确保我们没有越界访问数组。

if li[j - gap][1] > value[1]:在循环中,我们比较当前位置的前一个间隔增量的书籍 权重是否大于待插入书籍的权重

li[j] = li[j - gap]:如果前一个间隔增量的权重较大,我们将其向后移一个位置

j -= gap:然后,我们将j向前移动一个间隔增量,继续向前比较

else:break:如果前一个间隔增量的书籍权重不大于待插入的书籍权重,则跳出循环,因为我们要保持相同权重的情况下ID较小的排前面。

li[j] = value:最终,我们将待插入的书籍信息插入到正确位置

gap //= 2:在内层循环结束后,我们将增量gap减半,以缩小增量,这是希尔排序的一个重要步骤

for i in li:最后,我们使用for循环遍历排序后的书籍信息列表li

print(i[0]):通过print()函数输出每本书的ID,这样就满足了题目要求,按照权重排序,并在权重相同时,保留ID较小的书籍在前面。


例题3:咖啡馆订单系统

题目描述:

一家知名的连锁咖啡馆决定改进其订单管理系统。为了提高效率,他们决定使用某种指定属性的希尔排序,并确定在给定的增量序列下,需要多少次比较和交换对订单进行排序。

输入格式:

第一行,一个整数n,表示订单的数量。

第二行,一个整数m,表示增量序列的长度。

接下来的一行,包含m个以空格分开的整数,表示增量序列,题目保证增量序列严格递减且最后一个数是1.

接下来的n行,每行一个整数,表示订单的属性值。

输出格式:

两个整数,分别表示比较和交换的次数。

参考答案:

n = int(input())
m = int(input())
gaps = list(map(int,input().split()))
compare = 0
change = 0
li = []
for i in range(n):
    li.append(int(input()))
for gap in gaps:
    for i in range(gap,n):
        value = li[i]
        j = i
        while j >= gap:
            compare += 1
            if li[j - gap] > value:
                change += 1
                li[j] = li[j - gap]
                j -= gap
            else:
                break

        li[j] = value
print(compare,change)

运行结果:

以下是我对此题的理解:

n = int(input()):从标准输入中读取订单数量n,将其转换为整数并赋值给变量n

m = int(input()):从标准输入中读取增量序列的长度m,将其转换为整数并赋值给变量m

gaps = list(map(int,input().split())):从标准输入读取一行,使用split()函数将其分割成字符串序列,然后使用map()函数将其转换为整数,再将其转换为列表赋值给gaps

compare = 0和change = 0:初始化比较次数和交换次数为0

li = []:初始化一个空列表,用于存储订单的属性值

for i in range(n):循环n次,读取每个订单的属性值,并将其作为整数添加到列表li中

for gap in gaps:遍历增量序列中的每个增量

for i in range(gap,n):从增量gap开始,遍历订单列表进行排序

value = li[i] :将当前位置的订单属性值存储在变量value中,,用于后续比较和插入操作

j = i:将变量j初始化为当前变量i,用于向前比较和插入操作

while j >= gap:只要当前位置大于等于增量gap,就执行以下操作:

compare += 1:增加比较次数

li[j] = li[j - gap]:将前一个位置的属性值想后移动一位

j -= gap:将索引j向前移动一个增量gap的位置

else:break:如果不满足上述条件,就跳出循环

li[j] = value:将当前值value插入到正确的位置

print(compare,change):输出比较和交换次数


例题4:第3大的和

题目描述:

现在给定N个数,现在要求你从这N个数中挑选处理3个数,请你求出这3个数的和中第3大的是多少?

请注意,如果在求和过程中出现了相同的和,则只能留一个,其他的忽略不计。

输入格式:

输入的第一行包含一个整数n,表示数字的数量;

输入的第2行包含n个数字,代表给出的数字序列。

输出格式:

输出一行,包含一个数字,表示第3大的和。

参考答案:

import itertools
import heapq
n = int(input())
li = list(map(int,input().split()))
res = set()
for i in itertools.combinations(li,3):
    print(i)
    res.add(sum(i))
res = list(res)
print(heapq.nlargest(3,res))
print(heapq.nlargest(3,res)[-1])

运行结果:

以下是我对此题的理解:

import itertools:导入python中的itertools模块,用于生成序列的所有可能组合

import heapq:导入python中的heapq模块,用于堆操作,这里用于找出列表中的最大值

n = int(input()):从输入中读取一个整数,表示数字的数量,赋值给变量n

li = list(map(int,input().split())):从标准输入中读取一行数字,使用split()方法将其分割成单独的字符串列表,然后转换为整数,再转换为列表,赋值给变量li

res = set():初始化一个空集合,用于存储所有可能的和

for i in itertools.combinations(li,3):生成列表li中任意3个数字的组合,每次循环得到一个组合i

res.add(sum(i)):计算组合i的数字之和,并将其添加到集合set中

res = list(res):将集合转换为列表,为了后续使用heapq模块找出最大的3个值

print(heapq.nlargest(3,res)[-1]):找出前3大的和中的第3大值,即倒数第一个值,然后打印出来作为答案。


例题5:基数排序

题目描述:

实现基数排序算法。基数排序的介绍如下:

1.将整数按数位切割,然后将数值统一为同样的数位长度,数位较短的数前面补0;

2.从最低位开始,依次进行依次排序;

3.从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

请编写代码,完成排序,对给定数据进行升序排列。

输入描述:

第一行,数字N(2 <= N<=100),表示待排序的元素个数。

第二行,待排序的元素。

输出描述:

输出一行,为升序序列。

参考答案:

n = int(input())
li = list(map(int,input().split()))
max_len = len(str(max(li)))
for i in range(n):
    li[i] = str(li[i])
    li[i] = '0' * (max_len - len(li[i])) + li[i]
for i in range(max_len - 1,-1,-1):
    li.sort(key = lambda x:x[i])
print(*list(map(int,li)))

运行结果:

以下是我对此题的理解:

 n = int(input()):从标准输入中读取一个整数n,表示待排序的元素个数

li = list(map(int,input().split()))

max_len = len(str(max(li))):计算列表li中最大元素的位数,将其转化为字符串再求长度,得到最大的位数,并赋值给变量max_len。

for i in range(n):变量li中的每个元素

li[i] = str(li[i]):将当前元素转换为字符串

li[i] = '0' * (max_len - len(li[i])) + li[i]:将当前元素的字符串表示补齐到最大位数,前面用0填充

接下来逆序遍历每一位

li.sort(key = lambda x:x[i]):使用列表的sort方法,根据当前位i进行排序

最后输出。


OK,这篇就写到这里,下一篇继续!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/409507.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

预训练-微调范式在人工智能领域的深远影响

预训练-微调范式的出现是人工智能领域的一大里程碑&#xff0c;它深刻改变了深度学习模型的训练方式和应用模式&#xff0c;并对整个行业产生了多方面的深远影响&#xff1a; 数据效率提升&#xff1a; 通过在大规模无标注数据上进行预训练&#xff0c;模型能够学习到丰富的语言…

linux常用的网络命令实战分享

文章目录 ifup/down命令ifconfig命令观察网络接口信息修改接口参数增加虚拟网络接口 route命令查看路由表增加路由表规则删除路由表规则 IP 命令ip linkip addr设定路由 ip route arp 命令 在实际研发运维工作中常常会涉及到网关相关的操作和知识&#xff0c;这里对linux下常用…

(详细使用指南)Linux下交叉编译带ffmpeg的opencv并移植到RK3588等ARM端

一 问题背景 瑞芯微RK3588等嵌入式板作为边缘端设备为算法模型的部署提供了便利&#xff0c;目前很多分类或好检测模型针对边缘端做了优化或量化&#xff0c;使得在边缘端也能达到实时稳定的识别和检测效果。 但嵌入式设备普遍的flash emmc不大&#xff0c;一般在32G左…

【数据结构与算法】(20)高级数据结构与算法设计之 Greedy Algorithm 贪心算法 代码示例与详细讲解

目录 4.2 Greedy Algorithm1) 贪心例子DijkstraPrimKruskal 2) 零钱兑换问题有几个解&#xff08;零钱兑换 II&#xff09;Leetcode 518最优解&#xff08;零钱兑换&#xff09;- 穷举法 Leetcode 322最优解&#xff08;零钱兑换&#xff09;- 贪心法 Leetcode 322 3) Huffman …

9.5K Star,又一款超棒开源轻量自动化运维平台

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 一个好的运维平台就变得非常重要了&#xff0c;可以节省大量的人力和物…

【HarmonyOS】低代码开发—使用低代码开发服务卡片

DevEco Studio还支持使用低代码开发功能开发服务卡片&#xff0c;目前只支持JS语言&#xff0c;且compileSdkVersion必须为7或以上。 下面以创建一个新的服务卡片为例进行说明。 1.打开一个工程&#xff0c;创建服务卡片&#xff0c;创建方法包括如下两种方式&#xff1a; 选…

SpringBoot自带的tomcat的最大连接数和最大的并发数

先说结果&#xff1a;springboot自带的tomcat的最大并发数是200&#xff0c; 最大连接数是&#xff1a;max-connectionsaccept-count的值 再说一下和连接数相关的几个配置&#xff1a; 以下都是默认值&#xff1a; server.tomcat.threads.min-spare10 server.tomcat.threa…

老隋蓝海项目temu跨境电商好不好做?

近年来&#xff0c;跨境电商成为我国对外贸易的新亮点&#xff0c;其中Temu作为拼多多旗下的新兴跨境电商平台&#xff0c;吸引了众多国内卖家参与。老隋作为行业内的知名人士&#xff0c;他对Temu跨境电商项目的评价备受关注。本文将分析老隋对Temu跨境电商的看法&#xff0c;…

RDMA内核态函数ib_post_send()源码分析

最近调用linux内核下RDMA的Verb API ib_post_send()出现了问题&#xff0c;因此从源码分析一下这个函数的调用过程。 我使用的内核版本为5.15.0-94 这是函数ib_post_send的头文件定义&#xff0c;这个函数的意义是向发送队列提交发送请求&#xff0c;他会调用qp对应设备的post_…

Pyglet综合应用|推箱子游戏地图编辑器之图片跟随鼠标

目录 推箱子游戏 升级一&#xff1a;鼠标操作 升级二&#xff1a;增加网格 升级三&#xff1a;模拟按钮 综合应用&#xff1a;地图编辑器 关卡地图洗数 推箱子游戏 本篇为之前写的博客《Pyglet综合应用&#xff5c;推箱子游戏之关卡图片载入内存》的续篇&#xff0c;内容…

项目:shell实现多级菜单脚本编写

目录 1. 提示 2. 演示效果 2.1. 一级菜单 2.2. 二级菜单 2.3. 执行操作 3. 参考代码 1. 提示 本脚本主要实现多级菜单效果&#xff0c;并没有安装LAMP、LNMP环境&#xff0c;如果要用在实际生成环境中部署LNMP、LAMP环境&#xff0c;只需要简单修改一下就可以了。 2. 演…

ASCII编码的影响与作用:数字化时代的不可或缺之物

title: ASCII编码的影响与作用&#xff1a;数字化时代的不可或缺之物 date: 2024/2/25 16:03:37 updated: 2024/2/25 16:03:37 tags: ASCII起源标准化字符文本处理基础编程语言基石数据库存储标准跨平台兼容多语言编码基础 一、ASCII编码的起源 ASCII&#xff08;American St…

matlab 三质量-弹簧系统受激振力

1、内容简介 略 44-可以交流、咨询、答疑 建立系统运动方程&#xff0c;研究固有频率和对应主振型 2、内容说明 略 三质量&#xff0d;弹簧系统受激振力&#xff0c;并不考虑各自的阻尼。建立系统运动方程。 解&#xff1a;由于阻尼对固有频率没有影响&#xff0c;故本文不…

浅谈数据分析工具在智慧城市中的作用

随着城市化、技术进步和人口不断增长&#xff0c;智慧城市已成为当今世界主要技术发展之一。 智慧城市设备依靠描述模型对城市环境产生的大量数据进行数据分析。 在这种城市景观中&#xff0c;智慧城市是技术和可持续的城市地区&#xff0c;利用信息和通信技术(ICT)来改善城市…

异步http和同步http原理和差异

开发服务器端程序时&#xff0c;一种常见的需求是&#xff0c;通过向另一个http服务器发送请求&#xff0c;获得数据。最常规的作法是使用同步http请求的方式&#xff0c;过程如下 这种方式简单好用&#xff0c;但是在高并发场景下有缺陷。在单线程环境下&#xff0c;程序发送h…

linux调用so库之一

任务&#xff1a;linux系统&#xff0c;已经生成so库&#xff0c;需要调用。 参考文献&#xff1a; Linux 调用动态库&#xff08;.SO文件&#xff09;总结_linux deviceio.so-CSDN博客 可以看他的第一部分&#xff0c;即显式调用。但是会报错&#xff0c;我的版本是64位的U…

【SpringBoot】Spring常用注解总结

目录 ⭐spring springmvc和springboot的区别 Autowired 和Resource的区别和联系 1. SpringBootApplication 2. Spring Bean 相关 2.1. Autowired 2.2. Component,Repository,Service, Controller 2.3. RestController 2.4. Scope 2.5. Configuration 3. 处理常见的 HT…

vue3(vite)+electron打包踩坑记录(1)

vue3(vite)electron打包踩坑记录 - 打包vue 第一步 编译vue 使用vite构建vue&#xff0c;package.json如下 {"name": "central-manager","private": true,"version": "0.0.0","type": "commonjs",&q…

Autosar 开篇

背景 AUTOSAR&#xff08;Automotive Open System Architecture&#xff09;是一个跨汽车行业的标准化软件架构&#xff0c;旨在促进汽车电子系统的开发和部署。下面是AUTOSAR发展的一些关键点&#xff1a; 起源和背景&#xff1a; AUTOSAR最初于2003年由汽车制造商宝马、戴姆…

x(x-1)的含义

一.二进制中x&(x-1)的含义 把x的二进制最后一个1变为0 找一下规律&#xff1a; 二.应用 我们可以利用这个特性&#xff0c;来数这个数字中有多少数字1 算法分析&#xff1a;放入一个计数器&#xff0c;每循环一次&#xff0c;就把这个数字的最后一个1变为0&#xff0c;计数…