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

news2024/7/6 18:21:57

今日复习内容:做复习题

例题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.coloradmin.cn/o/1467774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打开 Camera app 出图,前几帧图像偏暗、偏色该怎样去避免?

1、问题背景 使用的安卓平台&#xff0c;客户的应用是要尽可能快的获取到1帧图像效果正常的图片。 但当打开 camera 启动出流后&#xff0c;前3-5帧图像是偏暗、偏色的&#xff0c;如下图所示&#xff0c;是抓取出流的前25帧图像&#xff0c; 前3帧颜色是偏蓝的&#xff0c;…

【前端素材】推荐优质后台管理系统Airmin平台模板(附源码)

一、需求分析 系统定义 后台管理系统是一种用于管理和监控网站、应用程序或系统的在线工具。它通常是通过网页界面进行访问和操作&#xff0c;用于管理网站内容、用户权限、数据分析等。后台管理系统是网站或应用程序的控制中心&#xff0c;管理员可以通过后台系统进行各种管…

中国农业无人机行业市场现状分析与投资前景预测研究报告

全版价格&#xff1a;壹捌零零 报告版本&#xff1a;下单后会更新至最新版本 交货时间&#xff1a;1-2天 第一章农业无人机行业发展综述 第一节农业无人机行业定义及分类 一、农业无人机行业的定义 农业无人机是一种无人驾驶的飞行器来帮助优化农业经营&#xff0c;增加作…

jetson nano——报错(已解决):ModuleNotFoundError: No module named ‘wx‘

目录 1.问题描述&#xff1a;2.报错&#xff0c;如下图&#xff1a;3.**解决&#xff1a;得安装一些wxpython的依赖&#xff0c;然后自己编译**3.1 wxPython链接4.编译过程中的图片&#xff1a;&#xff08;用时48min.....流泪&#xff09;5.编译完成以后的图片6.验证结果7.这是…

怎么在wifi中实现手机和电脑文件互传

有时我们想手机电脑文件互传&#xff0c;数据线却不在身边&#xff0c;这时我们可以用MiXplorer来实现wifi中手机和电脑互相访问文件。 MiXplorer是一款来自著名安卓开发者论坛XDA的作品&#xff0c;免费且功能强大&#xff0c;被很多人誉为是“全能文件管理器”。 1.在手机上…

【JavaEE】_smart tomcat常见问题

目录 1. 插件安装故障问题 2. 端口占用问题 3. 乱码问题 1. 插件安装故障问题 如果由于网络问题在IDEA中无法直接安装插件&#xff0c;可以去IDEA官网进行下载&#xff1a; 进入官网后点击Install安装&#xff0c;得到一个jar包&#xff1a; 把jar包拖拽到idea上即可自动安装…

职业规划,电气工程师的岗位任职资格

电气工程技术人员主要是指精通电气施工技术&#xff0c;从事与电气产相关研发工作并能够解决实际问题&#xff0c;对相关资源进行最终统筹的人员。一般来说&#xff0c;这类人员主要从事绘制、审核和把关电气图纸的工作&#xff0c;在审核电气图纸的时候&#xff0c;会检查施工…

(六)激光线扫描-三维重建

本篇文章是《激光线扫描-三维重建》系列的最后一篇。 1. 基础理论 1.1 光平面 在之前光平面标定的文章中,已经提到过了,是指 激光发射器投射出一条线,形成的一个扇形区域平面就是光平面。 三维空间中平面的公式是: A X + B Y + C Z + D = 0 A X+B Y+C Z+D=0

Spring Boot application.properties和application.yml文件的配置

在Spring Boot中&#xff0c;application.properties 和 application.yml 文件用于配置应用程序的各个方面&#xff0c;如服务器端口、数据库连接、日志级别等。这两个文件是Spring Boot的配置文件&#xff0c;位于 src/main/resources 目录下。 application.properties 示例 …

Linux--ACL权限管理

一.ACL权限管理简介 ACL&#xff08;Access Control List&#xff0c;访问控制列表&#xff09;是一种文件权限管理机制&#xff0c;它提供了比传统的UGO&#xff08;用户、组、其他&#xff09;权限更灵活的权限设置方式。以下是ACL的一些主要功能&#xff1a; 针对特定用户或…

[力扣 Hot100]Day33 排序链表

题目描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 出处 思路 归并排序即可。 代码 class Solution { public:ListNode* merge(ListNode *h1,ListNode *h2) {ListNode *head nullptr;if(h1->val<h2->val){head h1;h1h1-…

我用Python写了一个倒计时软件

人过中年&#xff0c;每天都觉得时间过得很快&#xff0c;忙活了一天却发现自己很多时候是瞎忙&#xff0c;似乎没有什么成效&#xff0c;匆忙中一天就过去了。 后来&#xff0c;我想想可能是我没有时间的紧迫感&#xff0c;或者说没有明确的目标和执行力&#xff0c;所以才会…

代码随想录刷题39,40天|62.不同路径

62.不同路径 想要求dp[i][j]&#xff0c;只能有两个方向来推导出来&#xff0c;即dp[i - 1][j] 和 dp[i][j - 1]。 此时在回顾一下 dp[i - 1][j] 表示啥&#xff0c;是从(0, 0)的位置到(i - 1, j)有几条路径&#xff0c;dp[i][j - 1]同理。 那么很自然&#xff0c;dp[i][j] …

堆排序法的名字由来,排序步骤是什么,最坏情况下的排序次数如何计算得来的呢?

问题描述&#xff1a;堆排序法的名字由来&#xff0c;排序步骤是什么&#xff0c;最坏情况下的排序次数如何计算得来的呢&#xff1f; 问题解答&#xff1a; 堆排序法的名字来源于它使用了堆这种数据结构。堆是一种特殊的树形数据结构&#xff0c;具有以下特点&#xff1a;在…

AI:135-基于卷积神经网络的艺术品瑕疵检测与修复

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

信息系统项目管理师(高项)—学习笔记

第一章信息化发展 1.1 信息与信息化 1.1.1 信息 信息是物质、能量及其属性的标示的集合&#xff0c;是确定性的增加。 它以物质介质为载体&#xff0c;在传递和反映世界各种事物存在方式、运动状态等的表征。 信息不是物质&#xff0c;也不是能力&#xff0c;它以一种普遍…

在python里的常用运算符及优先级

python常用的运算符有七种&#xff0c;分为两部分来学习&#xff0c;第一部分是各个运算法的用法&#xff0c;第二部分是运算符的优先级。 一、 运算符的用法 数字相关的运算符有&#xff1a;算数运算符、比较运算符、赋值运算符和位运算符 关系运算符&#xff1a; 示例如…

TreeData 数据查找

TreeData 数据查找 最近做需求的时候遇到了这样的一个需求&#xff0c;Tree组件数据支持查找&#xff0c;而且TreeData的数据层级是无限级的 开始想的事借助UI组件库&#xff08;Ant-design-vue&#xff09;中的Tree组件的相关方法直接实现,看了下api 发现没法实现&#xff0c;…

【多线程】volatile 关键字、wait 和 notify方法详解

volatile 、wait 和 notify &#x1f332;volatile关键字&#x1f6a9;保证内存可见性&#x1f6a9;volatile 不保证原⼦性 &#x1f333;wait 和 notify方法&#x1f6a9;wait()&#x1f6a9;notify()&#x1f6a9;notifyAll()方法 ⭕wait 和 sleep 的对比&#xff08; 面试题…

C#中的关键字params的用法

C#中有一个关键字params&#xff0c;它相对于一些主要关键字来说&#xff0c;还算是较为低频的&#xff0c;但也会用到。我们可以了解和学习下。 一、定义及约束 params关键字的作用在于可以让方法参数的数目可变。 params的参数类型必须是一维数组。 一旦在方法加入了para…