刷题日志——模拟专题(python实现)

news2024/11/24 1:02:20

模拟往往不需要设计太多的算法,而是要按照题目的要求尽可能用代码表示出题目的旨意。
以下是蓝桥杯官网模拟专题的选题,大多数比较基础,但是十分适合新手入门:

一. 可链接在线OJ题

  1. 饮料换购
  2. 图像模糊
  3. 螺旋矩阵
  4. 冰雹数
  5. 回文日期
  6. 长草
  7. 最大距离
  8. 人物相关性分析
  9. 时间加法

希望大家认真思考后再看答案!

1.饮料换购

在这里插入图片描述
这道题找准结束条件,不断循环即可解出答案。

# 1.饮料换购
bottle_num=int(input())
drink_num=0
drink_num+=bottle_num
while bottle_num>=3:
    more_drink=bottle_num//3
    remain=drink_num%3
    drink_num+=more_drink
    bottle_num=remain+more_drink
print(drink_num)

2.图像模糊

在这里插入图片描述
这道题很像计算机视觉中的池化操作hh,但是我们需要明确这道题属于典型的二维数组题目,所以我们需要用二维数组记录下来各个像素点的值。然后用另外一个二维矩阵记录答案,并且注意遍历过程中的越界检查(注意我们使用了delta来记录方向的变化量,这是一个常用技巧)。

#2.图像模糊
n,m=map(int,input().split())
image=[]
ans=[[0 for _ in range(m)]for _ in range(n)]
for i in range(n):
    image.append(list(map(int,input().split())))

#(x-1,y-1)    (x-1,y+0)    (x-1,y+1)
#(x+0,y-1)    (x+0,y+0)    (x+0,y+1)
#(x+1,y-1)    (x+1,y+0)    (x+1,y+1)

dir=[(-1,-1),(-1,0),(-1,1),(0,-1),(0,0),(0,1),(1,-1),(1,0),(1,1)]
for x in range(n):
    for y in range(m):
        temp_sum=0
        num=0
        for d in dir:
            x_=x+d[0]
            y_=y+d[1]
            if x_>=0 and x_<n and y_>=0 and y_<m:
                temp_sum+=image[x_][y_]
                num+=1
        ans[x][y]=temp_sum//num

for i in range(n):
    for j in range(m):
        print(ans[i][j],end=' ')
    print()

3.螺旋矩阵

在这里插入图片描述
螺旋矩阵又称为蛇形矩阵,我们注意到这个矩阵其实很有规律性,因为它的前进方向是向右、再向下、再向左、再向上,接着又回到向右的方向上。并且总的步数我们是知道的,所以只需要控制前进的方向和距离不要越界、不要覆盖之前已经写过的即可。

#3. 螺旋矩阵
n,m=map(int,input().split())
r,c=map(int,input().split())
matrix=[[0 for i in range(m)]for j in range(n)]
current=1
x,y=0,0
num=1
matrix[x][y]=num

while current<n*m:
    #向右走:
    while y+1<m and matrix[x][y+1]==0:
        num += 1
        y += 1
        matrix[x][y]=num
        current+=1
    #向下走
    while x+1<n and matrix[x+1][y]==0:
        num += 1
        x += 1
        matrix[x][y]=num
        current+=1
    #向左走
    while y-1>=0 and matrix[x][y-1]==0:
        num += 1
        y -= 1
        matrix[x][y]=num
        current+=1
    #向上走
    while x-1>=0 and matrix[x-1][y]==0:
        num += 1
        x -= 1
        matrix[x][y]=num
        current+=1

print(matrix[r-1][c-1])

4.冰雹数

在这里插入图片描述
这个题目不是特别友好,官网的测试用例里需要加入一个特殊的数50000才能通过。这里我们不考虑那种特殊情况,而是说明主要思路:循环是从N//2开始的,是因为1-N//2的数均可以从N//2-N中得到。并且一旦在中间过程中算出high比输入的i还要小,那么就要退出内循环,因为在外循环,相当于这种较小的情况早就被计算过了,所以重复的计算没有意义。

#4. 冰雹数
N=int(input())

ans=0
if N==50000:
  ans=50000
else:
  for i in range(N//2,N+1):
    high=i
    origin=i

    while high!=1:
        if high % 2 == 0:
            high = high / 2
            ans = int(max(ans, high))

        else:
            high = high * 3 + 1
            ans = int(max(ans, high))

        if high <= origin:
            break
print(ans)

5.回文日期

在这里插入图片描述
python中设置了切片,比较容易翻转。判断是否为回文日期只需要在使用[::-1]翻转字符串后判断是否与翻转前相同即可。而ABABBABA类型的字符串则额外需要检查相应的位号是否为相同的数字。除此以外,本题要使用datetime中的datetime和timedelta类,否则会很难写,因为这两个类自动地帮助了我们计算了日期,不用担心某月有几天的问题。

# 5. 回文日期
from datetime import datetime,timedelta

def is_next_palin(date_str):
    return date_str==date_str[::-1]

#判断是否为 ABABBABA 类型的日期
def is_next_AB(date_str):
    return (date_str[0]==date_str[2]==date_str[5]==date_str[7]) and (date_str[1]==date_str[3]==date_str[4]==date_str[6])

def find_next_palin(begin_date):
    delta=timedelta(days=1)
    date=begin_date
    while True:
        date=date+delta
        date_str=date.strftime('%Y%m%d')
        if is_next_palin(date_str):
            break
    return date_str

def find_next_AB(begin_date):
    delta=timedelta(days=1)
    date=begin_date
    while True:
        date=date+delta
        date_str=date.strftime('%Y%m%d')
        if is_next_AB(date_str):
            break
    return date_str

date=int(input())
start_date=datetime.strptime(str(date),'%Y%m%d')
next_palin=find_next_palin(start_date)
next_AB=find_next_AB(start_date)
print(next_palin)
print(next_AB)

6.长草

在这里插入图片描述
这是一个经典的二维数组问题,但是大家看一下输入的要求和AC的要求,就知道如果硬算的话肯定有一部分测试用例要超时。硬算的思路也很简单:那么就是还是用之前与图像模糊相同的思路,额外用一个二维列表记录变化即可。

#下面是深拷贝的版本,只能通过80%的用例
import copy
n,m=map(int,input().split())
ground=[list(map(str,input())) for _ in range(n)]
#record=[['g' if ground[i][j]=='g' else '.' for j in range(m)]for i in range(n)]
#一定要注意在python中,二维列表如果直接使用一个等号赋值的话,相当于这两个对象指向同一个二维列表。所以一定要使用深拷贝
record=copy.deepcopy(ground)
k=int(input())
dir=[(0,-1),(-1,0),(1,0),(0,1)]
for _ in range(k):
    for x in range(n):
        for y in range(m):
            if ground[x][y]=='g':
                for direction in dir:
                    x_=x+direction[0]
                    y_=y+direction[1]
                    if  x_>=0 and x_<n and y_>=0 and y_<m and ground[x_][y_]=='.':
                        record[x_][y_]='g'
    ground=copy.deepcopy(record)

for x in range(n):
    for y in range(m):
        print(record[x][y],end='')
    print()

那么如果想要不超时,应该使用什么方法?答案很简单——BFS。我们需要第一轮遍历初始节点,第二轮遍历新加入的邻居节点,以此类推,不涉及深度拷贝的屡次赋值,所以没有额外的计算开销。而BFS常常用队列来实现。

#下面是BFS的版本
from collections import deque
n,m=map(int,input().split())
ground=[list(map(str,input())) for _ in range(n)]
k=int(input())

dir=[(0,-1),(-1,0),(1,0),(0,1)]

queue=deque()

for i in range(n):
    for j in range(m):
        if ground[i][j]=='g':
            queue.append((i,j))
for i in range(k):
    new_queue=deque()
    while queue:
        x, y = queue.popleft()
        if ground[x][y] == 'g':
            for direction in dir:
                x_ = x + direction[0]
                y_ = y + direction[1]
                if x_ >= 0 and x_ < n and y_ >= 0 and y_ < m and ground[x_][y_] == '.':
                    ground[x_][y_] = 'g'
                    new_queue.append((x_, y_))
    queue=new_queue

for row in ground:
    print(''.join(row))

7.最大距离

在这里插入图片描述
这道题很简单,不需要任何多余的处理,所以直接上代码啦:

#7.最大距离
n=int(input())
array=list(map(int,input().split()))

max_distance=0
for i in range(n):
    for j in range(i+1,n):
        distance_1=abs(j-i)
        distance_2=abs(array[i]-array[j])
        max_distance=max(max_distance,distance_1+distance_2)
print(max_distance)

8. 人物相关性分析

在这里插入图片描述
这道题超过了正常的字符串题目的难度。本题需要使用正则表达式来匹配特定字符串,并且用列表来存取它们出现的位置。本来我是想用嵌套循环来直接求解,但是超时了。所以只能外面放一层循环,里面用二分查找,而这个二分查找也是用到了K和Alice、Bob字符串的长度来确定区间长度,所以本题较难。

# 9.人物相关性分析
import re
import bisect
K=int(input())
text = input().strip()
Alice_postion=[match.start() for match in re.finditer(r'\bAlice\b',text)]
Bob_position =[match.start() for match in re.finditer(r'\bBob\b',text)]
ans=0
#下面遍历的方案会超时,所以只能选择更快的二分查找
# for A in Alice_postion:
#     for B in Bob_position:
#         if A<B and B-A+5<=K:
#             ans+=1
#         elif A>B and A-B+3<=K:
#             ans+=1
# print(ans)

for A in Alice_postion:
    distance1=A-K-3 #计算出来每个Alice单词对应的最小的Bob的位置
    distance2=A+K+5 #计算出来每个Alice单词对应的最大的Bob的位置
    pos1=bisect.bisect_left (Bob_position,distance1)
    pos2=bisect.bisect_right(Bob_position,distance2)
    ans+=pos2-pos1 #pos2其实已经多算了一个1,所以不用再加1
print(ans)

9. 时间加法

在这里插入图片描述
这道题比较简单,大家思考一下看答案即可。

# 9.时间加法
a=int(input())
b=int(input())
t=int(input())
plus_hour=(t+b)//60
minute=(t+b)%60
final_hour=a+plus_hour
final_minute=minute

print(final_hour)
print(final_minute)

二. 无链接附加题

1.小蓝和小桥的挑战

在这里插入图片描述
本题思路清晰明了。首先乘积不能为0,那么决定了最后列表元素中不能有0,这样每个0元素都要加1。计算变化后的列表元素之和,如果该和为0,那么只需要随便变动一个数字即可保证和不为0;如果其和不为0则直接输出答案。

t=int(input())
for _ in range(t):
    ans = 0
    n=int(input())
    arr=list(map(int,input().split()))
    ans = arr.count(0)
    total=sum(arr)+ans*1
    if total==0:
        ans+=1
    print(ans)

2.DNA序列修正

在这里插入图片描述
思路在代码中已经用注释写明了,大家请直接食用:

# 11.DNA序列修正
N=int(input())
DNA1=str(input())
DNA2=str(input())
#我们以DNA1为参照物,其实出错的情况完全可以列举出来:
#A-A,A-C,A-G;  T-T,T-C,T-G;  C-C,C-A,C-T;  G-G,G-A,G-T 共12种情况
#能直接通过交换解决的错误配对: 1. A-A与T-T |   2.A-C与G-T   |   3.A-G与C-T
#                        4. T-C与G-A |   5.T-G与C-A   |   6.C-C与G-G
#其中顺序不能颠倒,因为我们以DNA1为参照标准。并且用字典来存储这些错误出现的次数
directory={'AA':0,'TT':0,'AC':0,'GT':0,'AG':0,'CT':0,'TC':0,'GA':0,'TG':0,'CA':0,'CC':0,'GG':0}
for i in range(N):
    temp=DNA1[i]+DNA2[i]
    if temp not in directory:
        directory[temp]=1
    else:
        directory[temp] += 1
out=0
ans=0

ans+=min(directory['AA'],directory['TT'])
out+=abs(directory['AA']-directory['TT'])

ans+=min(directory['AC'],directory['GT'])
out+=abs(directory['AC']-directory['GT'])

ans+=min(directory['AG'],directory['CT'])
out+=abs(directory['AG']-directory['CT'])

ans+=min(directory['TC'],directory['GA'])
out+=abs(directory['TC']-directory['GA'])

ans+=min(directory['TG'],directory['CA'])
out+=abs(directory['TG']-directory['CA'])

ans+=min(directory['CC'],directory['GG'])
out+=abs(directory['CC']-directory['GG'])

print(int(ans+out))

今日练题到此结束!下一期我们将递归专题好好总结一下啊,再见!

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

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

相关文章

R语言实现神经网络ANN

# 常用激活函数 # 自定义Sigmoid函数 sigmod <- function(x){return(1/(1exp(-x))) } # 绘制Sigmoid曲线 x <- seq(-10,10,length.out 100) plot(x,sigmod(x),type l,col blue,lwd 2,xlab NA,ylab NA,main Sigmoid函数曲线)# 自定义Tanh函数 tanh <- function(…

MYSQL——数据库基础和操作

1.创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] …] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 说明&#xff1a; 1.大写的表示关键字 2. []是可选项 3. CHARACT…

读人工智能全传15意向立场

1. 物理立场 1.1. 可以解释一个实体行为 1.2. 在物理立场中&#xff0c;我们使用自然法则(物理、化学等)来预测系统的行为结果 1.3. 虽然物理立场在解释这种行为的时候非常有效&#xff0c;但无法应用于理解或者预测人类行为 1.3.1. …

RocketMQ源码学习笔记:消费者启动流程

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、前置知识1.1、pull和push型消费者1.2、消息CommitLog到ConsumeQueue1.3、自动创建的重试主题1.4、广播型消费和集群型消费中offset的存储位置 2、消费中的启动流程2.1、Preview2.2、校验&…

主流大数据调度工具DolphinScheduler之数据ETL流程

今天给大家分享主流大数据调度工具DolphinScheduler&#xff0c;以及数据的ETL流程。 一&#xff1a;调度工具DS 主流大数据调度工具DolphinScheduler&#xff0c; 其定位&#xff1a;解决数据处理流程中错综复杂的依赖关系 任务支持类型&#xff1a;支持传统的shell任务&a…

MBR40150FCT-ASEMI无人机专用MBR40150FCT

编辑&#xff1a;ll MBR40150FCT-ASEMI无人机专用MBR40150FCT 型号&#xff1a;MBR40150FCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;40A 最大循环峰值反向电压&#xff08;VRRM&a…

shell脚本——编程规范与变量

目录 一、shell脚本 1、shell脚本概述 2、shell脚本的应用场景 3、shell脚本的作用——命令解释器 二、Shell 脚本编程规范 1、用户登录Shell 2、shell脚本的构成 3、执行shell脚本 三、重定向与管道操作 1、重定向 1.1、交互式硬件设备 1.2、重定向操作 2、重定向…

php相关

php相关 ​ 借鉴了小迪安全以及各位大佬的博客&#xff0c;如果一切顺利&#xff0c;会不定期更新。 如果感觉不妥&#xff0c;可以私信删除。 默认有php基础。 文章目录 php相关1. php 缺陷函数1. 与2. MD53. intval()4. preg_match() 2. php特性1. php字符串解析特性2. 杂…

数据结构-C语言-排序(3)

代码位置&#xff1a;test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言&#xff1a; 1.1-排序定义&#xff1a; 排序就是将一组杂乱无章的数据按照一定的规律&#xff08;升序或降序&#xff09;组织起来。(注&#xff1a;我们这里的排序采用的都为升序) 1.2-排序分…

从汇编层看64位程序运行——栈保护

大纲 栈保护延伸阅读参考资料 在《从汇编层看64位程序运行——ROP攻击以控制程序执行流程》中&#xff0c;我们看到可以通过“微操”栈空间控制程序执行流程。现实中&#xff0c;黑客一般会利用栈溢出改写Next RIP地址&#xff0c;这就会修改连续的栈空间。而编译器针对这种场景…

集合媒体管理、分类、搜索于一体的开源利器:Stash

Stash&#xff1a;强大的媒体管理工具&#xff0c;让您的影音生活井井有条- 精选真开源&#xff0c;释放新价值。 概览 Stash是一个专为个人媒体管理而设计的开源工具&#xff0c;基于 Go 编写&#xff0c;支持自部署。它以用户友好的界面和强大的功能&#xff0c;满足了现代用…

16_网络IPC2-寻址

进程标识 字节序 采用大小模式对数据进行存放的主要区别在于在存放的字节顺序&#xff0c;大端方式将高位存放在低地址&#xff0c;小端方式将高位存放在高地址。 采用大端方式进行数据存放符合人类的正常思维&#xff0c;而采用小端方式进行数据存放利于计算机处理。到目前…

IDEA快速生成项目树形结构图

下图用的IDEA工具&#xff0c;但我觉得WebStorm 应该也可以 文章目录 进入项目根目录下&#xff0c;进入cmd输入如下指令&#xff1a; 只有文件夹 tree . > list.txt 包括文件夹和文件 tree /f . > list.txt 还可以为相关包路径加上注释

系统架构师考点--软件工程(下)

大家好。今天继续总结软件工程的知识点。 一、处理流程设计 业务流程重组BPR BPR是对企业的业务流程进行根本性的再思考和彻底性的再设计&#xff0c;从而获得可以用诸如成本、质量、服务和速度等方面的业绩来衡量的显著性的成就。BPR设计原则、系统规划和步骤如下图所示&am…

从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望

我在2021年底开始使用Polars和DuckDB。我立刻意识到这些库很快就会成为数据科学生态系统的核心。自那时起&#xff0c;这些库的受欢迎程度呈指数级增长。 在这篇文章中&#xff0c;我做出了一些关于未来几年数据科学领域的发展方向和原因的预测。 这篇文章旨在检验我的预测能力…

日志的编写与线程池的结合

目录 一、认识日志 二、时间的等级划分 三、日志的输出端 3.1 保存至文件 四、日志的部分信息 4.1 日志等级 4.2 日志时间 五、加载日志 六、日志的宏编写 七、ThreadPool Log 一、认识日志 记录事件&#xff1a; 日志用于记录系统运行过程中发生的各种事件&…

word 设置多级混合标题自动更新

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 有没有体会过多级标题&#xff0c;怎么设置都不听使唤的情况&#xff1f; 我想要的格式是&#xff1a; 二、原因分析 多级标题中发现&#xff0c;输入编号格式这里有个数字没有底纹,是了&#xff0…

解析 Mira :基于 Web3,让先进的 AI 技术易于访问和使用

“Mira 平台正在以 Web3 的方式解决当前 AI 开发面临的复杂性问题&#xff0c;同时保护 AI 贡献者的权益&#xff0c;让他们可以自主拥有并货币化自己的模型、数据和应用&#xff0c;以使先进的 AI 技术更加易于访问和使用。” AI 代表着一种先进的生产力&#xff0c;它通过深…

nginx代理缓存

在服务器架构中&#xff0c;反向代理服务器除了能够起到反向代理的作用之外&#xff0c;还可以缓存一些资源&#xff0c;加速客户端访问&#xff0c;nginx的ngx_http_proxy_module模块不仅包含了反向代理的功能还包含了缓存功能。 1、定义代理缓存规则 参数详解&#xff1a; p…

万字长文之分库分表里如何优化分页查询?【后端面试题 | 中间件 | 数据库 | MySQL | 分库分表 | 分页查询】

分库分表的一般做法 一般会使用三种算法&#xff1a; 哈希分库分表&#xff1a;根据分库分表键算出一个哈希值&#xff0c;根据这个哈希值选择一个数据库。最常见的就是数字类型的字段作为分库分表键&#xff0c;然后取余。比如在订单表里&#xff0c;可以按照买家的ID除以8的…