【mooc北大数据结构】【数据结构与算法Python】第四周作业_周小丫0_0的博客-程序员秘密

技术标签: python基础  

1.有序队列
思路:利用对字符串切片处理,直接将最后一个字母拼接到后面,然后进行比较得最小字符串。

def func(S):
    min_str = S
    for i in range(len(S)):
        S = S[1:] + S[0]
        if S < min_str:
            min_str = S
    return min_str
S = eval(input())
print(func(S))

思路:应用队列的先进先出特点,设置最开始的字符串为最小值,不断的将最后一个字母出队列,然后再将这个字母入队列,与设置的字符串进行比较,若小于的话,则替换最小值,若大于的话,继续出队列、入队列。直到将字符串的所有情况都遍历一遍。

# 超出内存限制了
class Queue:
    def __init__(self):
        self.items = []
    def isEmpty(self):
        return self.items == []
    def enqueue(self, item):
        self.items.insert(0,item)
    def dequeue(self):
        return self.items.pop()
    def size(self):
        return len(self.items)
 
def func(S):
    li = []
    q = Queue()
    
    for i in S:
        q.enqueue(i)
    
    k=0
    while k <= q.size():
        first = q.dequeue()
        q.enqueue(first)
        astr = ''.join(q.items)[::-1]

        if astr not in li:
            li.append(astr)
        k = k + 1

    output = min(li)
    return output

S = eval(input())
print(func(S))

2.最近的请求次数
第一版思路:

  • 就采用两个循环,对每一个元素都用列表的元素去比对;
  • 结果就很显然易见,时间复杂度为O(n^2),这一条思路时间超出了限制
# 运行时间超出限制
class Queue:
    def __init__(self):
        self.items = []
    def isEmpty(self):
        return self.items == []
    def enqueue(self, item):
        self.items.insert(0,item)
    def dequeue(self):
        return self.items.pop()
    def size(self):
        return len(self.items)
    
def func(mylist):
    # your code here
    q = Queue()
    
    for k in mylist:
        q.enqueue(k)
    
    output = []
    for i in mylist:
        cnt = 0
        n = 0
        while cnt < q.size():
            e = q.dequeue()
            if e <= i and e >= i-10000:
                n = n + 1
            q.enqueue(e)
            cnt = cnt + 1
        output.append(n)
        
    return output
     
mylist = eval(input())
print(func(mylist))

第二版改进
思路:Python构造队列这一个类,使列表右端为队列尾,列表左端为队列头;题给样例为从左到右依次递增的有序列表,则右端减掉左端小于10000的元素的个数就是需要求的;

  • 将mylist列表中的元素一个一个添加进去
  • 每添加一个元素mylist[k],循环判断新元素与队头元素相减是否大于10000,如果大于10000则将队尾元素出队;
  • 余下的队列长度就是满足题给要求的元素个数
# 用例3未通过,注意检查特殊值
class Queue:
    def __init__(self):
        self.items = []
    def isEmpty(self):
        return self.items == []
    def enqueue(self, item):
        self.items.append(item)
    def dequeue(self):
        return self.items.pop(0)
    def size(self):
        return len(self.items)

def func(mylist):
    # your code here
    q = Queue()
    cnum = []
    
    for k in mylist:
        q.enqueue(k)
        while q.items[-1]-q.items[0]>10000:
            q.dequeue()
        cnum.append(q.size())
    return cnum
     
mylist = eval(input())
print(func(mylist))

第三版全部通过。。真的。。写完发现自己是个智障。。┭┮﹏┭┮
思路:思路还是第二版的思路,就是当时没想通是运行结果提示注意检查特殊值是怎么去知道这个特殊值是啥,于是参考了一些别人的做法,然后知道了被我忽略的是列表中如果有重复元素应该怎么解决,最简单的,我在输入样例里多加了一个0,查看运行结果就知道了是自己没有对列表后第k个元素后与第k个元素值相等的元素进行计数

class Queue:
    def __init__(self):
        self.items = [] 
    def isEmpty(self):
        return self.items == []
    def enqueue(self, item):
        self.items.append(item)
    def dequeue(self):
        return self.items.pop(0)
    def size(self):
        return len(self.items)
 
def func(mylist):
    # your code here
    q = Queue()
    cnum = []
    
    for k in range(len(mylist)):
        q.enqueue(mylist[k])
        # print(q.items)
        while q.items[-1]-q.items[0]>10000:
            q.dequeue()
            # print(q.items)
        cnt = 0
        for i in range(k+1,len(mylist)):
            if mylist[i] == mylist[k]:
                cnt = cnt+1
            else:
                break
        cnum.append(q.size()+cnt)
        # print(cnum)
        # print('--------------')
    return cnum
     
mylist = [0,0,10,100,1000,10000,20000,100000]
print(func(mylist))

3.基数排序
思路题目已经给出来了,代码实现参考了老师b站的讲解;
采用了“队列”这种数据结构实现,巧用字符型这种数据类型

class Queue:
    def __init__(self):
        self.items = []
    def isEmpty(self):
        return self.items == []
    def enqueue(self,item):
        return self.items.insert(0,item)
    def dequeue(self):
        return self.items.pop()
    def size(self):
        return len(self.items)
        

def func(mylist):
    # your code here
    q_main = Queue()
    
    for x in mylist:
        q_main.enqueue(x)
    
    d = len(str(max(mylist)))
    dstr = "%%0%dd" % d
    
    q_num = [Queue() for _ in range(10)]
    
    for i in range(-1,-d-1,-1):
        while not q_main.isEmpty():
            e = q_main.dequeue()
            de = (dstr % e)[i]  # de取位数 
            q_num[int(de)].enqueue(e)
        
        for k in range(10):
            while not q_num[k].isEmpty():
                q_main.enqueue(q_num[k].dequeue())
    output = []
    while not q_main.isEmpty():
        output.append(q_main.dequeue())
    
    return output
     
mylist = eval(input())
print(func(mylist))
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33749437/article/details/105878128

智能推荐

asp.net 项目心得_dghm的博客-程序员秘密

项目完毕,对项目中遇到的关键难点,整理一下,希望对以后和其它人有帮助。1、在有母版的情况下,获取dropdownlist选中值。designer"runat="server"  Width="150px"Height="20px" AutoPostBack="True"OnTextChanged="designer_TextChanged">    NavigateUrl="javas

nyoj 571 整数划分(三)_少年少年少年奋斗奋斗奋斗的博客-程序员秘密

整数划分(三)时间限制:1000 ms  |  内存限制:65535 KB难度:5描述整数划分是一个经典的问题。请写一个程序,完成以下要求。 输入多组输入数据。每组输入是两个整数n和k。(1 &amp;lt;= n &amp;lt;= 50, 1 &amp;lt;= k &amp;lt;= n)输出对于输入的 n,k;第一行: 将n划分成若干正整数之和的划分数。第二行: 将n划分成k个正整数之和的划分数。第三行: 将n划分成最大...

java filereader 用法_第2章 FileReader类使用_何少言的博客-程序员秘密

1.1 FileReader读数据一次读取一个字符1.1.1 案例代码五:package com.itheima_02;import java.io.FileReader;import java.io.IOException;/** 需求:从文件中读数据并显示到控制台* 读数据--输入流--FileReader** FileReader:* FileReader(String fileName):...

基于proteus的51单片机仿真实例六十二、串口发送和接收字符串实例_在protues都有什么信息接受信息_老马识途单片机的博客-程序员秘密

本系列文章讲述了基于proteus仿真的51单片机学习,内容全面,不仅讲解电路原理,还讲解了单片机c语言,实例丰富,内容全面。

spring官网再次改版后spring框架的下载方法_Just do it 17的博客-程序员秘密

原本想根据网上教程在官网上下载spring框架,结果发现网上给的方法都过时了,链接都找不到,于是我自己在官网上摸索了下,总算找到下载地址,现分享如下:方法一:直接打开链接https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release/spring选择需要版本方法二:进入官网,看到如下页面,点进spring...

float的位操作_float移位操作_po_int的博客-程序员秘密

昨天师兄让用c写一个十进制数转换为IEEE754存储的程序,觉得对IEEE754有点了解,就做了起来刚开始就是接收到数据之后先将十进制数转化为二进制的小数,再将二进制的小数规格化为IEEE754格式。做了半天,先是定义了数组存储二进制的每一位,然后在将二进制位按IEEE754标准存放时卡住了。这时想到记得float就是按照IEEE754存放的,赶紧一查,还真是。果断换方向。今天终于解决。

随便推点

MySQL高级篇——索引失效案例_mysql索引失效案例_宋子浩的博客-程序员秘密

文章目录:1.案例分析1.1 数据准备1.2 全值匹配1.3 最左前缀法则1.4计算、函数、类型转换(自动或手动)导致索引失效1.5范围条件右边的列索引失效1.6不等于(!= 或者&lt;&gt;)索引失效1.7is null可以使用索引,is not null无法使用索引1.8like以通配符%开头索引失效1.9OR前后存在非索引的列,索引失效1.10数据库和表的字符集统一使用utf8mb42.结束语1.案例分析1.1 数据准备这...

win2012 加域_Windows Server 2012 域设置及客户端加入_张倬宁的博客-程序员秘密

WindowsServer2012定于下月18号正式发布,对于Windows服务器迷你是不是有一定的诱惑??想知道WindowsServer2012究竟有了哪些改变,别的先不说,咱们先来看一下Windows的一个亮点----域功能的改善吧!!当你安装完成WindowsServer2012后是不是很想尝试一下新版的域呢?那么我们一起来吧,打开运行输入dcpromo:是不是一个让你有...

Inno Setup设置生成安装包文件版本和软件发布者_inno setup生成安装包添加版本信息_Pailugou的博客-程序员秘密

使用Inno Setup生成软件安装包时,查看软件安装包版本信息,文件版本为0.0.0.0,安装的软件发布者为空,在Inno Setup打包脚本中加入以下代码即可:#define MyAppVersion 1.0.0.3#define MyAppPublisher “xxxxx”//安装包文件版本VersionInfoVersion = {#MyAppVersion}//版本发布者AppPublisher = {#MyAppPublisher}...

【elasticsearch】elasticsearch教程 es整合springboot教程 kibana安装教程 解决kibana访问404_孟秋与你的博客-程序员秘密

文章目录linux安装esspringboot-data整合eslinux安装eswindows启动可能会遇到的报错, 基本和linux是差不多的 可以参考解决方法官网下载es 。本文以es 7.6 举例 , (es7.15会有api的弃用调整 ,7.15之前的其它7.x版本应该差距较小,但是es大版本之间的差距还是比较大 需要注意api的使用变更)下载地址 :https://www.elastic.co/products/elasticsearch ,找到历史版本进行下载, 这种网站都时不时

SendMessage_洋航的博客-程序员秘密

Win32 API消息函数:SendMessage函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程 序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。      函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IPara...

(转)Tomcat配置单点登录(Single Sign-On)_cndone的博客-程序员秘密

一旦你设置了realm和验证的方法,你就需要进行实际的用户登录处理。一般说来,对用户而言登录系统是一件很麻烦的事情,你必须尽量减少用户登录验证的次数。作为缺省的情况,当用户第一次请求受保护的资源时,每一个web应用都会要求用户登录。如果你运行了多个web应用,并且每个应用都需要进行单独的用户验证,那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统,所...

推荐文章

热门文章

相关标签