Python每日一练:小艺读书醉酒的狱卒非降序数组(详解快排)

news2024/12/23 22:28:12

文章目录

  • 前言
  • 一、小艺读书
  • 二、醉酒的狱卒
  • 三、非降序数组
  • 总结


前言

今天这个非降序数组,阅读解理小学水平,说起来都是泪啊。我折腾了一天都没搞定,从冒泡写到快速排序。换了几种都还不行,我又给快排加上插入排序。结果还是不能全过!我以为题目有问题,我就用了sort测试,还真能过的!证明我排序代码写得烂…郁闷好半天,我决定去偷看测试数据。才发现这数据本身就是有序的,怪不得难度系数只有中…然后就用一分钟搞定。
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、小艺读书

题目描述:
书是人类进步的阶梯。 小艺每周因为工作的原因会选择性的每天多读几页或者少读几页。 小艺想知道一本n页的书她会在周几读完。

输入描述:
第一行输入n(1<=n<=1000); 第二行输入7个整数,分别表示周一~周日的读书页数p(0<=p<=1000)。(不考虑7个整数都为0的情况)

输出答案:(1-7)

代码如下(示例):

class Solution:
    def __init__(self) -> None:
        pass
    
    def solution(self, n, pages):
        result = None

        # TODO: 请在此编写代码
        pi = 0
        while True:
            n = n-pages[pi%7]
            pi += 1
            if n <= 0:
                result = pi%7
                break
                
        return result

非常之简单,因为前面有个+=1,所以后面的结果不用加1。需要注意的是,有可能一周读不完,要多循环一下,嗯~我还知道只算一周只能过40。

二、醉酒的狱卒

题目描述:
某监狱有一个由n个牢房组成的大厅,每个牢房紧挨着。每个牢房里都有一个囚犯,每个牢房都是锁着的。 一天晚上,狱卒感到无聊,决定玩一个游戏。在第一轮,他喝了一杯威士忌,然后跑下大厅,打开每个牢房的锁。在第二轮比赛中,他喝了一杯威士忌,然后跑下大厅,锁上每隔一个的牢房的锁(牢房2、4、6…)。在第三轮比赛中,他喝了一杯威士忌,然后跑下大厅。他每隔三个牢房(第3、6、9号牢房)就去一次。如果牢房被锁上了,他就把它打开;如果牢房门打开了,他就锁上牢房。他重复n轮,喝最后一杯,然后昏倒。 一些囚犯(可能为零号)意识到他们的牢房被解锁且狱卒丧失了行动能力。他们就可以立即逃跑。现在根据牢房数量,确定有多少囚犯越狱。

输入描述:
第一行输入包含一个正整数t。表示有t行数据,下面每一行都包含一个介于5和100之间(含5和100)的整数,即轮数n

输出描述:
对于每一行,必须打印出监狱有n个牢房时越狱的囚犯人数

代码如下(示例):

class Solution:
    def __init__(self) -> None:
        pass
    
    def solution(self, t, vector):
        result = []

        # TODO: 请在此编写代码
        for v in vector:
            v = int(v)
            rooms = []
            rooms = [False for _ in range(v+1)]
            for N in range(1, v+1):
                for i in range(1, v+1):
                    if i*N <= v:
                        rooms[i*N] = not rooms[i*N]
            result.append(sum(rooms))
        result = [str(x) for x in result]
        return result

虽然描述很长,但还真不难,就是描述中有个地方误导人,说有0号牢房,实际上是没有的!外循环是不同的牢房数、内循环是不同的波次。其实是同一个数,先定义了一个全False的列表,然后根据牢房号不停的翻转状态即可。最后用了sum统计True值的个数,就是可以逃跑的牢房数了。

三、非降序数组

这题太误导人了,我怎么看都是要求排序!所以我优化又优化了几波排序算法,采用了快速排序加尾数插入排序的办法。可惜也不能100分。虽然这测试数据有确实过份,长的一个列表约有十万个数。
不过写都写出来了,就在这记录一下,其实也挺不容易的了!

代码如下(不能全过的排序法示例):

def qmid(arr, left, right):
    # 取左、中、右的中值作为基数, 并对此三数排序
    center = (left+right)//2
    if arr[center] < arr[left]:
        arr[center], arr[left] = arr[left], arr[center]
    if arr[right] < arr[left]:
        arr[right], arr[left] = arr[left], arr[right]
    if arr[right] < arr[center]:
        arr[right], arr[center] = arr[center], arr[right]
    # 将基数放在right-1位置
    arr[right-1], arr[center] = arr[center], arr[right-1]
    pivot = arr[right-1]
    return pivot

def insert_sort(arr):

    n = arr.__len__()
    i, j = 1, 0
    while i < n:
        curr = arr[i]  # 待排的数
        j = i - 1
        while j >= 0 and curr < arr[j]:
            arr[j+1] = arr[j]    #以前面的比较
            j -= 1
        arr[j+1] = curr      #插入暂时正确的位置
        i += 1

def qsort(arr, left, right):
    if left+10 <= right:
        pivot = qmid(arr, left, right)
        i, j = left-1, right-1-1
        while True:
            while arr[i] < pivot:
                i += 1
            while arr[j] > pivot:
                j -= 1
            if i < j:
                arr[i], arr[j] = arr[j], arr[i]
            else:
                break
        arr[i], arr[right-1] = arr[right-1], arr[i]
        qsort(arr, left, i-1)
        qsort(arr, i+1, right)
    else:
        insert_sort(arr)

qmid函数是用来计算快排的基准数的,很多人喜欢取值第一个或最后一个,对于无序列表(数组)来说确实也没大问题,但很明显如果有序的数组就会让复杂度变成最差的n^2情况,所以这里采用了首尾中间三个数来比较取值,并顺手把这三个数排了序。尽量争取做到左右各半这种最好的情况。
第二个insert_sort函数是插入排序,它的作用是在快排分割成小于10个数的列表时,直接用插入排序来干了,对于基本有序的一个数组,插入排序的速度是很快的。其基本思想是:从第1个开始与它前面的数比较,小的就和前面的交换,大了就下一个,如此循环一次完成。因为经过前面的快排,数组是基本有序的,所以很快。

第三个函数就是快速排序的主体了,它其实了是冒泡排序的改良。基本思想是选取一个数作为中间值pivot,把比pivot小的放左边,比pivot大的放右边。然后把数组以pivot为界分成左右两半,递归再进行。这应该是已知的公认最快排序方法了。可惜水平不够,写出的过不了100分,有机会应该学习一下自带的排序是怎么写的。

好了,最后我又去参考了别人的思路,才发现这题压根不是让人重排序,给出的数组本身就是有序的,只要合并就行了。那么我们要考虑的就是二个数组哪个小的放前面,大的放后面的事。这就简单了,一个个比较好了:以下是100分代码,很简单

class Solution:
    def __init__(self) -> None:
        pass
    
    def solution(self, n, m, num1, num2):
        result = []

        # TODO: 请在此编写代码
        i, j = 0, 0
        while i<n and j<m:
            if num1[i] < num2[j]:
                result.append(num1[i])
                i += 1
            else:
                result.append(num2[j])
                j += 1
        if i<n:
            result += num1[i:]
        if j<m:
            result += num2[j:]
        result = [str(x) for x in result]
        return result

思路就是逐个比较前面的元素,小的先放入result,再比较下一个,当比较完一个数组后,剩余的直接全加入就行了。


总结

其实最后这题还是挺有意思的,我把最大的那个测试用例给记下来了,准备再想想怎么用排序的办法过关,明明系统自带的sort函数能过的嘛~

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

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

相关文章

MySQL--复合查询--0422

注&#xff1a;为了方便查看 mysql语句会有突然的换行&#xff0c;书写时请勿模仿。 目录 1.单表查询回顾 显示工资最高的员工的名字和工作岗位 显示工资高于平均工资的员工信息 2.多表查询 比如需要查询雇员名字和所在部门编号及部门名字。 显示部门号为10的部门名&…

“智慧赋能 强链塑链”——精细化工行业仓储物流数字化转型探讨

精细化工行业作为衡量国家化学工业水平高低的重要标志&#xff0c;为国民经济提供重要的终端产品支持&#xff0c;相比较大化工产品&#xff0c;精细化工产品需要高度专业技能和工艺&#xff0c;其生产过程需要复杂的化学反应&#xff0c;以及严格的控制条件&#xff0c;产出的…

基于 TiDB + Flink 实现的滑动窗口实时累计指标算法

作者&#xff1a;李文杰 前言 在不少的支付分析场景里&#xff0c;大部分累计值指标可以通过 Tn 的方式计算得到 。随着行业大环境由增量市场转为存量市场&#xff0c;产品的运营要求更加精细化、更快速反应&#xff0c;这对各项数据指标的实时性要求已经越来越高。产品如果能…

UDS-19服务的状态掩码字节解析

19服务读DTC信息有01、02、04、06、0A等子服务&#xff0c;使用诊断仪读取DUT数据一般只需发送4字节有效数据&#xff0c;其他无效字节用00或者CC填充&#xff0c;如03 19 02 09 00 00 00 00&#xff0c; 数据分解&#xff1a; 03&#xff1a;表示报文类型未单帧&#xff0c;长…

考研计算机组成原理总结(8)

一.计算机工作过程 计算机工作的过程&#xff0c;即一条条指令工作的过程&#xff1a; 取指令&#xff1a; 1.(PC)—>MAR&#xff0c;把PC存放的指令存储地址传送给MAR3.M(MAR)—>MDR&#xff0c;主存根据地址取出指令存放到MDR中4.(MDR)—>IR&#xff0c;指令从MD…

[golang gin框架] 28.Gin 发送短信,DES加密解,Cookie加密,解密操作

一.发送短信 1.简介 在用户注册的时候,需要发送短信来校验用户以及手机号,达到用户注册的目的,一般有很多短信接口来达到发送短信的操作,比如:云片短信服务,阿里云短信服务, 腾讯云短信服务等等,这里以腾讯云短信服务来发送短信: 腾讯云短信服务相关网址: 短信介绍 发送短信AP…

【计算机视觉 | 目标检测】Grounding DINO:开集目标检测论文解读

介绍一篇较新的目标检测工作&#xff1a; Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection论文地址为&#xff1a; https://arxiv.org/pdf/2303.05499.pdfgithub 地址为&#xff1a; https://github.com/IDEA-Research/GroundingD…

flask框架之----Flask-Mail邮件

介绍&#xff1a; Web应用程序经常需要向用户、客户端、管理员、运维人员等相关人员发送邮件。在Flask框架中提供了Flask-Mail邮件库来管理电子邮件的收发。 安装&#xff1a;flask-mail: pip3 install flask-mail配置&#xff1a; 服务器信息&#xff1a; Flask-Mail &…

ESP32学习笔记 -- ESP32-S3使用NVS存储数据

什么是NVS? 非易失性存储(Non-Volatile Storage)简称NVS,是用来保存一些设备断电后不能丢失的数据,乐鑫的ESP32-S3芯片使用了一套NVS库函数对外置的SPI FLASH进行读、写、擦除等操作。 ESP-IDF通过分区表的方式,在外部SPI FLASH里面开辟一段存储空间(也称作NVS分区),…

Vue3 基础语法

文章目录 1.创建Vue项目1.1创建项目1.2 初始项目 2.vue3 语法2.1 复杂写法2.2 简易写法2.3 reactive&#xff08;对象类型&#xff09;2.4 ref&#xff08;简单类型&#xff09;2.5 computed(计算属性)2.6 watch&#xff08;监听&#xff09; 3.vue3 生命周期4.vue3 组件通信4.…

程序员应该怎么自学才能入门 ?我来聊聊自己的经历

当你想成为一名程序员&#xff0c;如何自学入门是一个非常重要的问题。在这里我分享一下我的经验&#xff0c;希望能对你有所帮助。 首先&#xff0c;为了制定好你的学习路线&#xff0c;你可以在网上的培训机构网站找到一张基础路线图。这张路线图必须是跟行业对标的&#xf…

Leetcode 42 接雨水

Leetcode42接雨水 题解1&#xff1a;正反两扫&#xff08;Simple and effect&#xff09;题解2&#xff1a;DP题解3&#xff1a;单调栈&#xff08;单调栈存储的是下标&#xff0c;满足从栈底到栈顶的下标对应height的元素呈递减&#xff09;题解4&#xff1a;双指针&#xff0…

【CSS系列】第六章 · CSS列表、表格、背景、鼠标属性

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

【数据结构】- 链表之带头(哨兵位)双向循环链表(上)

文章目录 前言&#x1f31f;一、带头双向循环链表&#x1f31f;二、带头双向循环链表结构图&#xff1a;&#x1f31f;三、带头双向循环链表代码实现&#xff1a;&#x1f30f;3.1头插&#xff1a;&#x1f30f;3.2头插流程图&#x1f30f;3.3 尾插&#x1f30f;3.4尾插流程图&…

【CSS系列】第三章 · CSS三大特性和颜色的表示

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

Swagger简单了解

Swagger 介绍 使用swagger你只需要按照它的规范去定义接口及接口相关信息&#xff0c;在通过swagger衍生出来的一系列项目和工具&#xff0c;就可以做到生成各种格式的接口文档&#xff0c;以及在线接口调试页面等等。 官网&#xff1a;https://swagger.io/ knife4j是为javaMVC…

Linux网络——Shell编程之函数

Linux网络——Shell编程之函数 一、概述二、定义函数的格式1.格式一2.格式二 三、函数的查看和删除1.查看 declare2.删除 declare 四、函数的返回值1.return 返回值2.echo 返回值 五、函数的参数传入与变量范围1.函数的传参2.函数变量的作用范围 六、函数的应用1.阶乘2.递归目录…

知识不断分叉,知怎么来,才知怎么去

知识不断分叉&#xff0c;知怎么来&#xff0c;才知怎么去 定位方法论在中国的演化和继承 趣讲大白话&#xff1a;知道什么来&#xff0c;方知怎么去 【趣讲信息科技159期】 **************************** 定位也谈不上是科学意义上的理论 而是商业实践方法 不能神话 但也要有基…

深入了解目标检测技术--从基本概念到算法入门

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 众所周知&#xff0c;目标检测是计算机视觉领域中的重要任务之一&#xff0c;其目的是识别图像或视频中包含的物体实例并将其定位。实现目标检测可以帮助人们在自动驾驶、机器人导航、安防监控等领域中更好地理解和应用图…

K_A37_002 基于STC89C52RC驱动PCF8591模块 串口与OLED0.96双显示

K_A37_002 基于STC89C52RC驱动PCF8591模块 串口与OLED0.96双显示 所有资源导航一、资源说明二、基本参数参数引脚说明 三、驱动说明IIC地址/采集通道选择/时序对应程序: 四、部分代码说明1、接线引脚定义1.1、STC89C52RCPCF8591模块 五、基础知识学习与相关资料下载六、视频效果…