第十一届蓝桥杯python组试题解答

第十一届蓝桥杯python组试题解答

门牌制作

在这里插入图片描述

这道题目的意思是,找到[1, 2020] (注意是闭区间) 之间所有的数中包含2的数中2的个数的中枢。
也就是说从1开始找,找到含有2的数的,然后看这个数中有几个2。

例如2021就贡献了两个2.

方法一:数位分离

count = 0

for i in range(1, 2021):
    n = i
    while n != 0:
        m = n % 10
        n = n // 10
        if m == 2:
            count += 1

print(count)
# 624

方法二:强转字符串

count = 0

for i in range(1, 2021):
    count += str(i).count('2')

print(count)
# 624

寻找2020

在这里插入图片描述

数据是给的一个txt文件,里边有300行300列的数据,全部是数字0和数字2。我在官网上和其他地方也没有找到这个txt文件,就用样例数据测试吧。

220000
000000
002202
000000
000022
002020

注意:从文件里读出来的数据全部是字符串。

def check_s(s):
    return s == '2020'


data = []
# test.txt
# 220000
# 000000
# 002202
# 000000
# 000022
# 002020

# 读取数据
with open('test.txt', mode='r', encoding='utf-8') as fp:
    for line in fp:
        line = list(line.strip())
        data.append(line)

print(data)
# 读出来的全是字符串
# [['2', '2', '0', '0', '0', '0'], 
#  ['0', '0', '0', '0', '0', '0'], 
#  ['0', '0', '2', '2', '0', '2'], 
#  ['0', '0', '0', '0', '0', '0'], 
#  ['0', '0', '0', '0', '2', '2'], 
#  ['0', '0', '2', '0', '2', '0']]

m, n = len(data), len(data[0])
count = 0

for i in range(m):
    for j in range(n):
        # 行
        if i + 3 < n and check_s(data[i][j] + data[i+1][j] + data[i+2][j] + data[i+3][j]):
            count += 1
        # 列
        if j + 3 < m and check_s(data[i][j] + data[i][j+1] + data[i][j+2] + data[i][j+3]):
            count += 1
        # 斜
        if i + 3 < n and j + 3 < m and check_s(data[i][j] + data[i+1][j+1] + data[i+2][j+2] + data[i+3][j+3]):
            count += 1

print(count)
# 5

发散思维:考虑用字符串的count()函数来处理,每行每列的字符串很容易读出,然后用line.count(‘2020’)就可一得出line这个字符串中有多少个字串‘2020’,但是斜着怎么把对应的字符串取出没有找到很好的办法,有时间再更新。各位有想出好办法的可评论区留言。

跑步锻炼

在这里插入图片描述

直接利用python的标准库datetime里的datetime timedelta weekday即可方便的求出。关键位置已经给出解析。

import datetime

distances = 0
start_time = datetime.datetime(year=2000, month=1, day=1)  # 2000年1月1日00:00 周六
dela = datetime.timedelta(days=1)
end_time = datetime.datetime(year=2020, month=10, day=1)  # 到2020年10月2日00:00 这样包括10月1号 周四
time = end_time - start_time  # time为一个timedelta对象
# start_time.weekday() 返回数字0-6,0代表星期一,依次类推  5 代表星期六

while start_time <= end_time:
    if start_time.day == 1 or start_time.weekday()  == 0:
        # 月初或周一
        distances += 2
    else:
        distances += 1
    start_time += dela

print(distances)  # 8879

蛇皮走位

在这里插入图片描述

推荐用手算,挺快的。用代码的话也不是不可以。最近挺忙的,我的个人小站http://47.116.137.43/即将上线,域名liboer.top在备案中暂时不能以域名访问,还没有做cdn加速,首次访问加载会略慢,到时欢迎大家来访。这里就提供一下手算方法,关于代码有时间再补,也欢迎大家在评论区补上。
解题思路
我们可以看到,数的个数累加是以n(n+1)/2的方式递增,只不过最终的那个数分奇偶次序:奇数列、偶数行。例如:3三列第一个数字为3(3+1)/2=6 第四行第一个数为4(4+1)/2=10。所以要求第20行20列的数我们要知道它是斜着数的第几个。我们可以看到他是左右对称的,所以第20列的右边还有(20-1)=19列 所以第39列的第一个数是20行20列那个数所在的斜着的最后一个数。39是奇数,所以39(39+1) /20=780 780还有减去多出来的(39-20)=19个数 所以最终结果为 780 - 19 = 761
我的解题步骤
在这里插入图片描述

排序

在这里插入图片描述

冒泡排序
条件:相邻交换 交换100次 只有小写字母 不重复 最短 字典序最小
首先,相邻交换、只有小写字母 、不重复 、最短可以初步判定直接逆序,因为这样最短的串可以交换最多的次数。很容易得知交换次数为n(n-1)/2,n=15时,全部逆序可交换105次
即:onmlkjihgfedcba,交换105次
现在要交换100次,所以这个o肯定要往右移,很容易想到nmlkjoihgfedcba,这样是100次
但是,再看条件:字典序最小,所以要尽可能把小的往左移,考虑到多了五次,我们就把第五个字母j放在最后,这样jonmlkihgfedcba,每次交换都少移动五次,最后到j时恢复到逆序。
例如:
jonmlkihgfedcba 就是把o放到最后,得到jnmlkihgfedcbao。相比onmlkjihgfedcbao放到最后少了一次,nmlkjihgfedcbao
jnmlkihgfedcbao 就是把n放到最后,得到jmlkihgfedcbano。相比nmlkjihgfedcbaon放到最后少了一次

jonmlkihgfedcbajihgfedcbaklmno正好少了五次, 五次后onmlkjihgfedcba也变成了jihgfedcbaklmno后边就都一样了
结果:jonmlkihgfedcba

代码解释

def bubbl_sort(alist, count):
    for i in range(len(alist) - 1):
        for j in range(len(alist) - 1 - i):
            if alist[j] > alist[j+1]:
                count += 1
                alist[j], alist[j+1] = alist[j+1], alist[j]
        print(alist)
    return (alist, count)

count = 0
print(bubbl_sort(list('jonmlkihgfedcba'), count))


# 每趟循环结果
['j', 'n', 'm', 'l', 'k', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'o']
['j', 'm', 'l', 'k', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'n', 'o']
['j', 'l', 'k', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'm', 'n', 'o']
['j', 'k', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'l', 'm', 'n', 'o']
['j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'k', 'l', 'm', 'n', 'o']
['i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'j', 'k', 'l', 'm', 'n', 'o']
['h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['g', 'f', 'e', 'd', 'c', 'b', 'a', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['f', 'e', 'd', 'c', 'b', 'a', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['e', 'd', 'c', 'b', 'a', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['d', 'c', 'b', 'a', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['c', 'b', 'a', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['b', 'a', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']


(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o'], 100)


猜你喜欢

转载自blog.csdn.net/qq_31910669/article/details/114843073