【CSDN竞赛第20期】 Python 题解

比赛页: https://edu.csdn.net/contest/detail/34

题解

1、非降序数组

在这里插入图片描述

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

输入描述

第一行输入两个整数n,m。(1<=n,m<=100000)分别表示数组A,B的大小。
第二行给出n个整数a。(1<=a<=10000)
第三行给出m个整数b。(1<=b<=10000)

输出描述

输出合并之后排序好的数组。

输入样例

3 3
1 9 10
3 12 41

输出样例

1 3 9 10 12 41

分析

这道题目非常简单,只需将两个数组相加即可。但题目不允许使用内置 sort 函数,而题目数据量又比较大(1<=n,m<=100000),需要采用速度比较快的排序算法。

2、吃!吃!吃!

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

输入描述

第一行输入一个整数n。(1<=n<=100)
第二行输入n个整数。

输出描述

输出答案。

输入样例

4
1 1 1 1

输出样例

J

分析

这题没有看出和吃!吃!吃!有什么关系,只需每隔3个数相加即可,也不用考虑什么周期补零,后面没有满足3个间隔的数自然也不用加了。

参考代码

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

        # TODO: 请在此编写代码
        n1,n2,n3=0,0,0
        for i in range(0,n,3):
            n1+=arr[i]
        for i in range(1,n,3):
            n2+=arr[i]
        for i in range(2,n,3):
            n3+=arr[i]
        t=max(n1,n2,n3)
        if t==n1:
            result='J'
        elif t==n2:
            result='H'
        else:
            result='B'

        return result


if __name__ == "__main__":

    
    n = int(input().strip())
    
    
    arr = [int(item) for item in input().strip().split()]
    
    
    sol = Solution()
    result = sol.solution(n, arr)
    
    print(result)

3、计算逆波兰表达式的结果

在这里插入图片描述
逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“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 *”。

输入描述

第一行输入一个整数 n,表示包含元素数量.(1<=n<=1000)
第二行输入n个元素。

输出描述

输出计算后的结果。

示例1
输入
2
1 + 3 *

2 1 + 3 *

输出

9

示例2
输入

123 23 12 + -

输出
-88

88

分析

逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。

注:该题存在bug
原先的题目中提到“第一行输入一个整数 n,表示包含元素数量.(1<=n<=1000)”,示例1中输入第一行为“2”,第二行却是“1 + 3 *”。显然按照题目描述,如果表达式为1 + 3 *,缺少了一个操作数,该表达式无法计算,无法得出输出中的9。显然元素数量也不可能为2,因为无法构成表达式。推测正确的输入应为2 1 + 3 *,无需在第一行输入整数n,可得结果((2 + 1) * 3) = 9。题目的模板代码中却写了输入n的代码,提交代码后的测试用例并不需要n。
示例2中,输入为“123 23 12 + -”,而输出为“-88”,根据逆波兰表达式的定义,123 23 12 + -的中缀表达式应为123 - (23 + 12)=88,只有理解为(12+23)-123才会得到-88的结果而题目的测试用例依然存在此类问题,需要将错就错才能通过本题。
正确的题目可参照力扣150. 逆波兰表达式求值

参考代码

注:由于栈是LIFO(后进先出),所以减法和除法要注意操作符顺序,加法和乘法操作数颠倒不影响结果,但该题需将错就错才能通过。

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

        # TODO: 请在此编写代码
        temp=[]
        for t in arr:
            if t=="+":
                a,b=temp.pop(),temp.pop()
                c=int(b)+int(a)
                temp.append(c)
            elif t=="-":
                a,b=temp.pop(),temp.pop()
                c=int(b)-int(a)    #由于栈是LIFO,此处不能写c=int(a)-int(b)
                temp.append(c)
            elif t=="*":
                a,b=temp.pop(),temp.pop()
                c=int(b)*int(a)
                temp.append(c)
            elif t=="/":
                a,b=temp.pop(),temp.pop()
                c=int(b)//int(a)    #由于栈是LIFO,此处不能写c=int(a)//int(b)
                temp.append(c)
            else:
                temp.append(t)
        result=temp[-1]

        return result


if __name__ == "__main__":
    #n = int(input().strip())
    arr = input().split()
    
    
    sol = Solution()
    result = sol.solution(arr) 
    print(result)

4、会议安排

在这里插入图片描述
开会了!作为一个集体,开会的时候桌子当然是需要和老大相邻的!(老大可能坐在桌子上边)
小艺被分配到排桌椅的活,可是小艺的力气都用在吃上了,怎么可能搬动这些桌椅呢。
她决定用现有的布局当作是会议座位安排。
每个桌子分配一个人。相邻桌子不同的桌子颜色不同。
小艺想知道选择某个桌子之后老大身边能围多少人?

输入描述

第一行输入2个整数n,m,一个字符c。(1<=n,m<=100)分别表示空间大小和老大指定的桌椅颜色号。
以下n行每行m个字符。’.’代表空地,其他字符表示桌椅。连接在一个且相同的字符表示一个桌子。

输出描述

输出围着老大的人数。

输入样例

3 4 R
G.B.
BRRA
TTT.

输出样例

4

分析

从老大指定的桌椅向上下左右搜索,进行判断是否符合题目条件,即可。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Colazxk.xyz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值