第十二届蓝桥杯第四场模拟赛(编程题)

目录

6. 大小写转换

7. 福尔摩斯密电码

8. 位置的变化度

9. 出栈顺序

10. 长度为k的公共子序列


6. 大小写转换

问题描述:
给定一个单词,请将这个单词的首字母大写,后面的所有字母小写。
输入格式
输入一行包含一个字符串,表示给定的单词。
输出格式
输出变换后的单词。
样例输入
hello
样例输出
Hello
样例输入
WORLD
样例输出
World
样例输入
LanQiao
样例输出
Lanqiao
数据规模和约定
对于所有评测用例,单词的长度不超过 100,单词中只包含大小写英文字母。

思路分析:遍历输入的字符串,因为使用的是python语言,所以使用chr()与ord()函数进行ascii值与字符之间的转换,chr函数将ascii值转换为对应的字母,ord函数返回字母的ascii值,在循环中对当前遍历的字母进行判断即可

代码如下:

if __name__ == '__main__':
    s = input()
    res = ""
    # 小写字母ascii范围为97~122
    if 97 <= ord(s[0]) <= 122:
        res += chr(ord(s[0]) - 32)
    else:
        res += s[0]
    # 大写字母ascii范围为65~90
    for i in range(1, len(s)):
        if 65 <= ord(s[i]) <= 90:
            res += chr(ord(s[i]) + 32)
        else:
            res += s[i]
    print(res)

7. 福尔摩斯密电码

问题描述:
小Hi的公司经常举办回馈社会的爱心活动。这次小Hi作为志愿者带领社区的孩子们参观了青少年天文馆。他发现孩子们对于摩尔斯电码非常感兴趣。摩尔斯电码由两种基本的信号组成:短信号"滴"(用字符'.'表示)以及长信号"嗒"(用字符'-'表示)。下图是数字0-9的摩尔斯电码表示,每个数字都由5个字符组成:
.---- ..--- ...-- ....- ..... -.... --... ---.. ----. -----
1     2     3     4     5     6     7     8     9     0
为了让孩子们开心,小Hi决定把每位孩子的生日日期转化为摩尔斯码赠送给他们。例如日期20210101对应的摩尔斯电码是:
..--- ----- ..--- .---- ----- .---- ----- .----
你能写一个程序帮助小Hi吗?
输入格式
第一行是一个整数N,代表参加活动的孩子的人数。(1 <= N <= 100)
以下N行每行一个由0-9组成的字符串,代表一个生日日期。(日期格式:yyyymmdd,日期范围: 20000101至20210101)
输出格式
对于每个生日日期,输出一行表示转化后的摩尔斯码,数字之间用一个空格隔开。
样例输入
2  
20161011  
20000101
样例输出
..--- ----- .---- -.... .---- ----- .---- .----
..--- ----- ----- ----- ----- .---- ----- .----

思路分析:

我们可以将对应的福尔摩斯电码对应的字符串存储到列表中,这样就可以根据下标取出对应的福尔摩斯电码,根据输入的生日日期进行遍历然后取出对应的福尔摩斯电码拼接输出即可,主要是枚举字符串

代码如下:

if __name__ == '__main__':
    # 每个数字都由5个字符组成, 将这些字符存储起来然后根据不同的下标取出来即可
    s = ".---- ..--- ...-- ....- ..... -.... --... ---.. ----. -----"
    codes = s.split()
    last = codes.pop()
    # 使用insert函数插入到对应最后一个元素到第一个位置
    codes.insert(0, last)
    # print(codes)
    N = int(input())
    for i in range(N):
        bir = input()
        res = ""
        for j in bir:
            # 注意数字之间使用空格隔开
            res += codes[int(j)] + " "
        print(res)

8. 位置的变化度

问题描述:
给定一个序列 S = (s[1], s[2], ..., s[n]),一个位置 p 上的变化度是指以这个位置为中心的相邻的 5 个元素的最大值与最小值的差,即 s[p-2], s[p-1], s[p], s[p+1], s[p+2] 中最大值与最小值的差。一个序列总共有 n-4 个变化度,位置 1, 2, n-1, n 没有变化度。例如,对于下面的序列 (1, 0, 4, 8, 5, 7, 6),总共有 3, 4, 5 三个位置有变化度,分别为 8, 8, 4。给定一个序列,请求出这个序列的变化度。
输入格式
输入的第一行包含一个整数 n,表示给定的序列长度。
第二行包含 n 个整数 s[1], s[2], ..., s[n],表示给定的序列。
输出格式
输出一行,包含 n-4 个非负整数,分别表示每个位置的变化度。
样例输入
7
1 0 4 8 5 7 6
样例输出
8 8 4
数据规模和约定:对于所有评测用例,5 <= n <= 1000,0 <= s[i] <= 1000000。

思路分析:暴力枚举序列S,计算序列每个位置的变换度即可

if __name__ == '__main__':
    n = int(input())
    nums = list(map(int, input().split()))
    res = list()
    for i in range(n - 4):
        mmin, mmax = 1000000, 0
        for j in range(i, i + 5):
            if mmin > nums[j]: mmin = nums[j]
            if mmax < nums[j]: mmax = nums[j]
        res.append(mmax - mmin)
    print(res)

9. 出栈顺序

问题描述:
小Hi正在研究一种特殊的栈。这种栈的元素既可以从栈顶出栈,也可以从栈底出栈。(进栈还是只能从栈顶进栈)已知入栈的序列是1~N的一个排列,请你判断出栈序列能否是1, 2, 3, ... N?
输入格式
输入包含多组数据。
输入第一行包含一个整数T,代表测试数据的组数。
以下每组数据占据2行。
第一行包含一个整数N。
第二行包含N个整数,整数中由空格隔开。表示入栈序列。
输出格式
对于每组数据输出YES或者NO,代表出栈序列能否是1, 2, 3, ... N。
样例输入
2
5
2 4 1 3 5
5
4 3 1 5 2
样例输出
YES
NO
数据规模和约定
对于30%的评测用例,1 <= N <= 10
对于80%的评测用例,1 <= N <= 10000
对于所有评测用例,1 <= N <= 100000, 1 <= T <= 10。

思路分析:

分析题目最容易想到的是模拟入栈与出栈的顺序,首先是接收到这个入栈顺序的数字,将这些数字存储到列表中,然后遍历这个列表,声明一个变量cur表示当前即将要弹出的数值,每遍历一个数字那么就需要将其进栈,然后匹配当前栈顶元素与栈底元素是否与当前即将要弹出的元素是一样的,如果满足那么就需要将cur += 1,表示下一次弹出的元素值为cur + 1,并且弹出当前匹配成功的栈顶或者是栈底元素,最后判断cur是否等于n加1即可(n为输入的数字数目),因为使用的是python语言,所以使用python中的列表来充当栈的作用,主要还是模拟整个过程,不过数据量大可能是通不过的

代码如下:

if __name__ == '__main__':
    t = int(input())
    # 模拟整个入栈与出栈的过程
    for i in range(t):
        n = int(input())
        nums = list(map(int, input().split()))
        cur, stack = 1, list()
        for j in range(n):
            stack.append(nums[j])
            # 最后一个元素或者是第一个元素与目前的数字相等的时候那么弹出当前的元素
            while stack and stack[-1] == cur:
                stack.pop()
                cur += 1
            while stack and stack[0] == cur:
                stack.pop(0)
                cur += 1
        if cur == n + 1: print("YES")
        else: print("NO")

10. 长度为k的公共子序列

问题描述:
给定两个序列 A=(a_1, a_2, ..., a_n) 和 B=(b_1, b_2, ..., b_m), 它们的一个公共子序列是指从两个序列中分别取出相同个数的元素,按照原来的顺序排列后,对应位置的数值相等。
例如,对于序列 A=(3, 2, 7, 6, 7) 和 B=(2, 3, 5, 7),可以在序列 A 中取出第 2, 3 个元素,在序列 B 中取出第 1, 4 个元素,值都是 2, 7,因此 2, 7 是一个公共子序列,在 A 中取第 2, 3 个元素和在 B 中取 1, 4 个元素是这个公共子序列的一种取法。
在这两个序列中,有 4 中取法可以取出长度为 2 的公共子序列,例如
1. 在 A 中取第 1, 3 个元素,在 B 中取 2, 4 个元素;
1. 在 A 中取第 1, 5 个元素,在 B 中取 2, 4 个元素;
1. 在 A 中取第 2, 3 个元素,在 B 中取 1, 4 个元素;
1. 在 A 中取第 2, 5 个元素,在 B 中取 1, 4 个元素。
给定两个序列,请问有多少种取法可以取出长度为 k 的公共子序列。
输入格式
输入第一行包含三个整数 n, m, k,分别表示序列 A 的长度、序列 B 的长度和公共子序列的长度。
第二行包含 n 个整数 a_1, a_2, ..., a_n,表示给定的 A 序列。
第三行包含 m 个整数 b_1, b_2, ..., b_m,表示给定的 B 序列。
输出格式
输出一行,包含一个整数,表示长度为 k 的公共子序列的数量,答案可能很大,请输出答案除以 1000007 的余数。
样例输入
5 4 2
3 2 7 6 7
2 3 5 7
样例输出
4
数据规模和约定
对于 30% 的评测用例,1 <= n, m <= 20。
对于 50% 的评测用例,1 <= n, m <= 100。
对于所有评测用例,1 <= n, m <= 1000, 1 <= k <= 10, 0 <= a_i <= 100。
思路分析:

暂时木有什么想法,以后会了再重新补上

代码如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值