当前位置: 移动技术网 > IT编程>脚本编程>Python > 洛谷python解题——肖邦“黑键”练习曲

洛谷python解题——肖邦“黑键”练习曲

2020年07月08日  | 移动技术网IT编程  | 我要评论
肖邦“黑键”练习曲最近参加了公司在OJ平台-洛谷举办的月赛,我呢,就怀着激动的心、颤抖的手,点击报名献个丑;没想到啊,还真是献了个丑,一共6道题,提交了5个,结果没有一个AC的,悲痛声如雷贯耳;但是我也有些小疑问,我写的代码测试了很多次,输出结果完全没问题,时间和内存也都测试过了啊,那问题出在哪里了?所以接下来我先分享一个最简单的题目和我用python的解题思路,看一下问题到底在哪里!题目内容题目背景简单一看,题目描述其实也比较好理解:就是说一个标准的钢琴“黑键”和“白键”加起来一共有88个(很

肖邦“黑键”练习曲

最近参加了公司在OJ平台-洛谷举办的月赛,我呢,就怀着激动的心、颤抖的手,点击报名献个丑;没想到啊,还真是献了个丑,一共6道题,提交了5个,结果没有一个AC的,悲痛声如雷贯耳;但是我也有些小疑问,我写的代码测试了很多次,输出结果完全没问题,时间和内存也都测试过了啊,那问题出在哪里了?
所以接下来我先分享一个最简单的题目和我用python的解题思路,看一下问题到底在哪里!

题目内容

在这里插入图片描述
题目背景简单一看,题目描述其实也比较好理解:
就是说一个标准的钢琴“黑键”和“白键”加起来一共有88个(很吉利),然而小Z呢,想要编一个程序来实现:按下一定数量的钢琴键,可以统计一共按下了多少次“白键”。
输入输出要求也很简单:第一行输入一个数字,代表我接下来要按下的琴键的个数;第二行输入按下的琴键的编号,中间用空格隔开。
题意很清晰,接下来就开始分析呗,首先我按照要求搜索了一下标准钢琴按键的分布图,如下所示:
在这里插入图片描述
黑白键的分布看得时间久了真的眼晕啊~但也没办法,先把黑白键分别标注一下,看一下有什么规律,于是我就做了一个表格:
在这里插入图片描述
说实话,即使找不到规律,到还有一个笨方法:反正钢琴一共也就88个键,白键也只有52个白键,那我直接把所有的白键序号写进一个列表,然后依次【遍历】就可以了,其实这种方法在数量较少的情况下确实可行,那就干吧,所以先定义一个列表,储存所有白键的序号:

White_Key = [1, 3, 4, 6, 8, 9, 11,13,15,\
                   16,18,20,21,23,25,27,\
                   28,30,32,33,35,37,39,\
                   40,42,44,45,47,49,51,\
                   52,54,56,57,59,61,63,\
                   64,66,68,69,71,73,75,\
                   76,78,80,81,83,85,87,88]

这样看着其实真的不多,真的!
那么接下来我们需要在第一行键入一个数字,代表接下来要输入按键序号的个数:

in_num = int(input())

这里为什么要前面加个int,不必多说,因为通过input()输入的都是字符串类型,需要强制转化为整数类型;接下来我们换行开始键入in_num个钢琴键序号:

list_num = input()
list_split = list_num.split(" ")

看一下这两行代码,第一行就是我们键入的钢琴键序号,比如“2 3 4 5 6”,那第二行的处理是为什么呢?因为同样的,使用input()键入的“2 3 4 5 6”其实是一个字符串,我们想要的是里面的数字,但是这一字符串还包含了一些空格,所以这里使用了.split()方法,用来拆分字符串,.split(" ")的引号内有一个空格,就代表将空格两边的字符进行拆分,然后再将拆分后的字符储存在list_split列表里,我们看一下效果:
输入:

1 2 4 5

结果:

['1', '2', '4', '5']

结果是list_split列表里的内容,我们首先实现里拆分,但其实里面的每一个元素还都是字符串类型,先不急转化,我们可以等到遍历的时候再转换。
接下来设置一个存放白键数量的初始变量“White”并设为0:

White = 0

然后就开始通过for来进行遍历了,我们的思路是先在list_split列表中按顺序把每一个元素与白键列表White_Key里面的序号进行遍历比较,一旦出现相同的值,White变量自身加1,然后跳出for,这样一个按键就判断完了,再开始下一个按下按键的遍历,所以有一个for循环的嵌套:

for i in range(in_num):
    for j in range(52):
        if(int(list_split[i]) == White_Key[j]):
            White += 1
            break

外层循环是我们输入了几个按键,就会执行几次,是为了“解包”出每个按下的按键序号;内层循环是将按下的按键序号与每个白键序号进行对比,并且在这里将list_split里的数字进行类型转换,一旦list_split里的按键序号与White_Key的白键序号相等了,就令White加1,然后跳出循环,进行下一个按下按键的遍历;完整代码如下:

White_Key = [1, 3, 4, 6, 8, 9, 11,13,15,\
                   16,18,20,21,23,25,27,\
                   28,30,32,33,35,37,39,\
                   40,42,44,45,47,49,51,\
                   52,54,56,57,59,61,63,\
                   64,66,68,69,71,73,75,\
                   76,78,80,81,83,85,87,88]
                   
in_num = int(input())
list_num = input()
list_split = list_num.split(" ")

White = 0

for i in range(in_num):
    for j in range(52):
        if(int(list_split[i]) == White_Key[j]):
            White += 1
            break
            
print(White)

我们对题目给出的几个数据进行测试;
输入:

5
1 2 3 4 5

输出:

3

输入:

8
10 20 30 40 50 60 70 80

输出:

4

但是OJ给出的测试点信息是:
在这里插入图片描述
有哪位大神可以指教一下呢?

本文地址:https://blog.csdn.net/qq_37744263/article/details/107183134

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网