Python解题 - CSDN周赛第20期 - 逆波兰 / 后缀表达式

news2024/9/26 3:23:27

不知不觉已经参加了19场比赛了,由于参赛次数多,排名竟然稀里糊涂地上升到第一,受宠若惊,赶紧截图保存纪念一下。

正好又赶上元旦,新的2023年,希望CSDN的周赛能越办越好,尽量少出bug,也希望自己能够保持学习持续进步,在python算法领域以及大众编程普及方面能够取得一点点成绩。


第一题:非降序数组

写一个函数,传入两个非降序的整数数组(A, B),将 A, B 合并成一个非降序数组 C,返回 C(不要使用内置 sort 函数)。

分析

题目说明了不准使用内置 sort 函数,不然一句代码就可以解题了。但是话又说回来,官方真的会手动检查吗?

此题还是经典的归并排序(印象里考了好几次了),依次比较两个数组元素的大小,添加进新的数组,同时移动下标的位置即可。

参考代码

n, m = map(int, input().strip().split())
num1 = [int(item) for item in input().strip().split()]
num2 = [int(item) for item in input().strip().split()]
result = []
i = j = 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
result.extend(num1[i:])
result.extend(num2[j:])
print(*result)

第二题:吃!吃!吃!

已知n个整数。 每3个数算一个周期。 不足一个周期补0。在周期的第一个位置的数的权值和等于a1+a[1+3]+… … 第二个位置的数的权值和等于a2+a[2+3]+… … 求三个数的最大权值。 如果最大权值为第一个数,输出’J’;最大权值为第二个数,输出’H’;最大权值为第三个数,输出’B’。

分析

题目描述得有点费劲,看了半天才懂,就是没看出和标题的“吃吃吃”有什么关系。所谓的权值其实就是 n 个整数每隔3个数加在一起的总和,而这种“每隔几个数如何如何”的做法,使用python列表的切片操作可以说是信手拈来,而且都不用去关心够不够3个数或一个周期、需不需要补0,因为切片操作如果得到的是空列表,使用加总计算会自动得到0。

最后我们得到三个数,还要找出他们的最大值,然后根据最大值所在位置的不同,输出不同的字母。因为只有三个数,怎么做都行,问哥使用了字典,当然使用循环找出最大值也没差。

参考代码

n = int(input().strip())
arr = [int(item) for item in input().strip().split()]
result = []
for i in range(3):
    result.append(sum(arr[i:n:3]))
r = {0:"J",1:"H",2:"B"}
print(r[result.index(max(result))])

第三题:计算逆波兰表达式的结果

逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作“3 4 - 5 +”:先3减去4,再加上5。使用逆波兰记法的一个好处是不需要使用括号。例如中缀记法中“3 - 4 * 5”与“(3 - 4)*5”不相同,但后缀记法中前者写做“3 4 5 * -”,无歧义地表示“3 (4 5 *) -”;后者写做“3 4 - 5 *”。

示例:

示例一示例二
输入

3 4 5 * -

123 23 12 + -

输出17-88

分析

逆波兰表达式(Reverse Polish Notation, RPN),也叫后缀表达式,是纪念波兰逻辑学家Jan Lukasiewicz的成就,不知道是不是因为他的名字太难记了,世人使用他的国籍而不是名字来命名。该表达式最大的作用就是让计算机更容易操作人类的数学表达式,也不需使用括号来标记运算的优先级。

而更为我们所熟知的却是“后缀表达式”这个叫法,因为我们人类使用的数学表达式一般称为中缀表达式,顾名思义,“中缀”就是指运算符号在两个数的中间,而“后缀”则在两个数的后面。而中缀转后缀的方法,相信是所有学过数据结构的同学都练习过的,这也是栈操作的经典方式。

而本题的后缀表达式实际上有个“小错误”,从示例二就可以看出来,其计算结果是负数,说明它是使用栈顶第一个元素作为双目运算式左边的数字,第二个元素作为右边的数字,这和传统的后缀表达式是正好相反的,和题目中的描述也有所不同(所以我按照这个逻辑自己编了示例一)。不知道是不是考题故意为之,也许是为了考察大家是否真正懂得了后缀表达式计算的原理吧。

计算过程其实并不复杂:

  1. 依次读入后缀表达式,如果遇到数字,则数字进栈;
  2. 如果遇到运算符,则将栈顶的两个数字出栈,使用该运算符进行计算,将计算结果重新入栈;
  3. 如此往复,直到读完后缀表达式。

下图显示了示例二的计算过程:

参考代码

arr = input().strip().split()
n = len(arr)
result = []
for i in range(n):
    if arr[i].isdigit():
        result.append(arr[i])
    else:
        a = result.pop()
        b = result.pop()
        r = str(int(eval(a+arr[i]+b)))
        result.append(r)
print(r)

由于本题没有限定双目计算符的范围(除了加减乘除,还有可能是乘方、整除等) ,所以问哥也没有将字符串转成整数型,然后再去判断运算符的种类,从而进行不同的运算。取而代之地,直接借助python的eval函数,可以将字符串的算术表达式计算出结果。这样也许有投机取巧之嫌,但既然python提供了这么方便的函数,完全没必要再去重复造轮子了,而且本题的重点是掌握逆波兰表达式的原理即可。


第四题:会议安排

开会了!作为一个集体,开会的时候桌子当然是需要和老大相邻的!(老大可能坐在桌子上边) 小艺被分配到排桌椅的活,可是小艺的力气都用在吃上了,怎么可能搬动这些桌椅呢。 她决定用现有的布局当作是会议座位安排。每个桌子分配一个人。互相连接相同字符表示一个桌子,如UVV表示2张桌子,UVU则表示3张桌子。小艺想知道选择某个桌子之后老大身边能围多少人?

示例:

示例
输入

3 4 R

G.B.

BRRA

TTT.

输出

4

分析

本题不难,但是太繁也太麻烦。不知道是不是问哥对题目理解得不够深入,反正我是使用穷举法找出的答案,就是找出和“老板”所在的“桌子”(字符串)相邻的上下左右四个方向有多少连续的、不同的字符串。所以,首先,是要找到“老板”所在的“桌子”的上下左右四个边界(当然,本题也有个简化的前提:这个“桌子”是矩形的,如果是不规则的形状就更加麻烦了),然后根据这个边界,去搜寻四边的字符串有哪些字符是连续的、相同的(小数点“.”代表空地,除外)。

比如示例中的老板所在的桌子是R,如下图所示,上边相邻的是B,下边相邻的是T,左边相邻的是B,右边相邻的是A,总共四个位置,答案就是4。

代码实现也不难,但问哥总觉得应该有更优化更优雅的方法,放在这里权当抛砖引玉了。 

参考代码

n, m, c = input().strip().split()
n = int(n)
m = int(m)
vector = []
for i in range(n):
    vector.append(input().strip())
res = 0
top = left = bottom = right = -1
for i in range(n):
    for j in range(m):
        if top < 0 and vector[i][j] == c:
            top, left = i, j # “老板”所在“桌子”的左上角
        if bottom < 0 and vector[n-i-1][m-j-1] == c:
            bottom, right = n-i-1, m-j-1 # “老板”所在“桌子”的右下角
    if top >= 0 and bottom >= 0: break # 找到“桌子”边界,退出搜索
a = b = "."
for i in range(left, right+1): 
    if top > 0 and vector[top-1][i] != a: # 搜寻上方相邻的字符串
        a = vector[top-1][i]
        if a != ".": res += 1
    if bottom < n-1 and vector[bottom+1][i] != b: # 搜寻下方相邻的字符串
        b = vector[bottom+1][i]
        if b != ".": res += 1
a = b = "."
for i in range(top, bottom+1): 
    if left > 0 and vector[i][left-1] != a: # 搜寻左边相邻的字符串
        a = vector[i][left-1]
        if a != ".": res += 1
    if right < m-1 and vector[i][right+1] != b: # 搜寻右边相邻的字符串
        b = vector[i][right+1]
        if b != ".": res += 1
print(res)

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

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

相关文章

P1047 [NOIP2005 普及组] 校门外的树

题目 [NOIP2005 普及组] 校门外的树 题目描述 某校大门外长度为 lll 的马路上有一排树&#xff0c;每两棵相邻的树之间的间隔都是 111 米。我们可以把马路看成一个数轴&#xff0c;马路的一端在数轴 000 的位置&#xff0c;另一端在 lll 的位置&#xff1b;数轴上的每个整数…

批量化工程项目的实施过程

最近的批量化项目存在方案设计上的问题&#xff0c;导致很严重的后果。 1、各个相关方都需要投入较大的精力来处理此事&#xff1b; 2、投入的时间、金钱及人员等均在其中&#xff1b; 3、方案需要进行重新的验证&#xff0c;总体项目工程的周期进一步被压缩&#xff1b; 4…

21-InnoDB引擎底层存储和缓存原理

到目前为止&#xff0c;MySQL对于我们来说还是一个黑盒&#xff0c;我们只负责使用客户端发送请求并等待服务器返回结果&#xff0c;表中的数据到底存到了哪里&#xff1f;以什么格式存放的&#xff1f;MySQL是以什么方式来访问的这些数据&#xff1f;这些问题我们统统不知道。…

【C++ Primer】阅读笔记(1):基础

目录 简介类型选择(经验准则)当一个算术表达式既有int,又有无符号数时,int会转换为无符号数对象初始化与赋值的区别声明与定义全局变量与局部变量示例引用指针与引用的区别不可以将int变量直接赋值给指针,即便这个int变量是0const对象必须初始化参考结语简介 Hello! 非常…

pdf转换器电脑版免费,好用的办公操作软件集合

工作中太多的文件格式需要我们进行操作了&#xff0c;各种各样的文件可以打开的软件经常是不同的。就像是PDF文件&#xff0c;如果没有在电脑安装对应的可以打开的软件&#xff0c;可能我们就没办法直接查看文件内容。而且这种情况也不是偶然出现&#xff0c;可能还会随着我们文…

信息系统项目管理师的论文如何提高?

简单点来说吧&#xff01;也适合软考小白来看&#xff01; 信息系统项目管理师论文要写几道题&#xff1f;没有参加过信息系统项目管理师考试的考生对于论文科目考试不是很了解&#xff0c;那么信息系统项目管理师论文到底要写几道题呢&#xff1f; 软考高级信息系统项目管理…

振弦采集模块辅助功能寄存器之低功耗休眠

振弦采集模块辅助功能寄存器之低功耗休眠 在收到休眠指令后&#xff0c;完成当次测量后立即进入低功耗的休眠模式&#xff0c;休眠模式下&#xff0c; VDD 电流可降至 1mA 左右&#xff0c;当收到数字接口任意数据后自动唤醒。此功能会使硬件看门狗失效&#xff0c;存在模块意…

关于项目型和职能型组织结构的思考和笔记

1、区别项目型还是职能型&#xff0c;最根本的要点在于&#xff0c;沟通渠道必须通过谁&#xff08;负责人是谁&#xff0c;是项目经理还是职能经理&#xff0c;谁有沟通渠道控制权&#xff09;&#xff1b; 2、沟通渠道的控制权取决于利益的优先权&#xff08;例如&#xff1…

前端常用处理时间方法

项目上用到很多时间格式,写了一些处理时间的方法,也可以用第三方库,下面是我自己项目封装的一下方法,命名瞎写的,有些方法是关联的,很多没有怎么完善,记录一下,兼容ios时间问题,时间太赶没有完善,将就用下,人和程序有一个人跑就行 获取当前时间戳 getTodayTomorrowTtem export…

求树的直径(史上最详细,匠心之作,限时免费看)

一&#xff0c;题目SPOJ PT07Z, Longest path in a tree一.定义树上任意两节点之间最长的简单路径即为树的「直径」。二&#xff0c;解法做法 1. 两次 DFS过程:首先从任意节点y, 开始进行第一次 DFS&#xff0c;到达距离其最远的节点&#xff0c;记为 z&#xff0c;然后再从 z开…

ARM S5PV210 中断体系与外部中断实战

一、中断体系介绍 1、什么是中断 中断的发明是用来解决宏观上的并行需要的。宏观就是从整体上来看&#xff0c;多件事情都完成了。微观上的并行&#xff0c;就是指的真正的并行&#xff0c;就是精确到每一秒甚至每一刻&#xff0c;多个事情都是在同时进行的。宏观上面的并行并…

OQC与Cyxtera将量子计算应用于数据中心

牛津量子电路&#xff08;OQC&#xff09;正与云服务公司Cyxtera合作&#xff0c;在数据中心安装量子计算机&#xff0c;方便用户在其本地数据集上运行量子算法。 在葡萄牙里本举行的网络峰会上&#xff0c;牛津量子电路&#xff08;OQC&#xff09;首席执行官ILana Wisby谈到了…

【力扣经典题目】环形链表,判断链表是否有环

题目描述&#xff1a; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链…

【Unity】新手初学Animation实现人物移动

【Unity】新手初学Animation实现人物移动 需求&#xff1a;开发影院系统&#xff0c;希望加入Avatar人物&#xff0c;在其中行走和坐下 环境&#xff1a;Unity2021.3 新手初学Animation教程&#xff1a;BV1BW41187fL Avatar人物模型资源&#xff1a;学长网盘链接分享 Animation…

【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

实习------SpringMVC 框架学习

Spring MVC 是什么 &#xff08;了解&#xff09;Spring MVC&#xff08;全称 Spring Web MVC&#xff09;是 Spring 框架提供的一款基于 MVC 模式的轻量级 Web 开发框架&#xff0c;是 Spring 为表示层&#xff08;UI&#xff09;开发提供的一整套完备的解决方案。注&#xff…

《Linux运维总结:使用旧版redis-shake2.x进行redis集群间的数据同步【方案二】》

一、redis-shake简介 redis-shake是阿里云开源的用于Redis数据迁移和过滤的工具。 Github参考&#xff1a;redis-shake简介 1.1、迁移工具对比 redis-migrate-tool redis-migrate-tool是唯品会开源的一款Redis异构集群之间的数据实时迁移工具&#xff0c;不过已经有两年没有更…

如何对【javaSE】语法阶段复习

下面是我对学习java阶段的总复习&#xff0c;我愿称之为【复习宝典】 如果你对java的部分语法阶段的知识有所困惑&#xff0c;进来看看吧&#xff01; 文章目录 目录 文章目录 一、初始java 1.1java 的由来 1.2JDK安装 1.3main方法的介绍 二、数据类型和变量 2.1数据类型 三、运…

xxljob 里面 InheritableThreadLocal详解,XxlJobContext类的详解

目录 1 需求2 XxlJobContext类3 InheritableThreadLocal 类可以做什么1 需求 在xxljob 里面,有一个地方使用到了InheritableThreadLocal类 我们先说XxlJobContext类是干什么的,里面有什么东西 2 XxlJobContext类 这个类就是一个实体类,可以理解为实体类,里面有属性,有g…

Spring Boot读取配置文件内容的三种方式

系列文章目录 Spring Boot[概述、功能、快速入门]_心态还需努力呀的博客-CSDN博客 该系列文章持续更新中~ 目录 系列文章目录 前言 一、Value 二、Environment 2.1 注入对象 2.2 调用获取属性的方法 2.3 上述两种方法对比 三、ConfigurationProperties 3.1 创建一个实…