本人小白,几乎没有算法基础,蓝桥杯还剩俩月不到突击备考!(死猪不怕开水烫了属于是)
第一次参加Acwing周赛,只做对了第一题……
目录
一、周赛链接
二、周赛题+分析+代码+知识点学习
A AcWing 4806. 首字母大写
1.题目描述
给定一个由大小写字母构成的单词。
如果单词的首字母为小写字母,则请你将该首字母转换为对应大写字母。
如果单词的首字母为大写字母,则不做任何变化。
输出最终的单词。
输入格式
一个由大小写字母构成的非空字符串,表示给定单词。
输出格式
输出最终的单词。
数据范围
前 33 个测试点满足,输入单词长度范围 [1,10][1,10]。
所有测试点满足,输入单词长度范围 [1,1000][1,1000]。
输入样例1:
ApPLe
输出样例1:
ApPLe
输入样例2:
konjac
输出样例2:
Konjac
2.思路分析
本题比较简单,使用upper()函数即可
3.代码实现
s = input()
print(s[0].upper() + s[1:])
4.相关知识点复习
本题考点:字符串大小写转换的操作方法
#字符串是不可变序列,每次转换都会产生新的字符串对象,原来的字符串是不变的
(1).upper() 所有字符转成大写字母
(2).lower() 所有字符转成小写字母
(3).swapcase() 所有小写转大写,所有大写转小写
(4).capitalize() 第一个字符转成大写,其余转成小写
(5).title() 每个单词的第一个字符转成大写,每个单词的其余字符转成小写
Upper (→Up的比较级) adj.上面的;更高的 (up:向上→完全,彻底)
Lower(→low的比较级) adj.更低的→下面的;降下 (low低)
Swap (先后)交换 exchange (同时)交换
Case n.1.情况;案件;病例
2.箱,盒,容器
(1.cas=cid落下→偶然降临的事情)
(2.catch抓,拿→盛东西的容器)
Capitalize 首字符大写
title 标题;头衔,称号'''
s = 'hello,python'
a = s.upper() # 字符串是不可变序列,每次转换都会产生新的字符串对象,原来的s 是不变的
print(a, id(a))
print(s, id(s))
t = a.lower()
print(t, id(t))
print(t == s) # True (== 内容相同)
print(t is s) # False (is 地址和内容都相同)
s2 = 'hello Python'
print(s2.swapcase())
print(s2.capitalize())
print(s2.title())
B AcWing 4807. 找数字
1.题目描述
给定一个正整数 m和一个非负整数 s。
请你找到长度为 m且各位数字之和为 s 的最小和最大非负整数。
要求所求非负整数不得包含前导零。
输入格式
共一行,两个整数 m,s。
输出格式
在一行内输出满足条件的最小和最大非负整数。
如果无解,则输出 -1 -1
。
数据范围
前 66 个测试点满足 1≤m≤3。
所有测试点满足 1≤m≤100,0≤s≤900。
输入样例1:
2 15
输出样例1:
69 96
输入样例2:
3 0
输出样例2:
-1 -1
2.思路分析
- 本题不能用暴力,若m == 100,遍历for i in range(10 ** (m - 1), 10 ** m)数据会非常大
- 所以我们需要对长度为m的整数的每一位进行分析
根据题目条件分析,可得出:
if m == 1: # 一位数 if s < 10: ... # 有解 s s else: ... # 无解 -1 -1 else: # 两位数及以上 if 1 <= s <= 9 * m: # 每位数上的数字最大是9 ... # 有解 else: ... # 无解 -1 -1
其他都好写,主要看当m > 1 and 1 <= s <= 9 * m的情况:
- 先定义长度为m的字符串(也可用列表),尝试将所有位置都通过贪心算法填上数
- 最大的好理解,从左往右优先填9
- 最小可以反过来想,从右往左优先填9,但是这个数的第一位不能是0吧,所以需要给第一位留一个1
3.代码实现
m, s = map(int, input().split())
if m == 1: # 一位数
if s < 10:
print(s, s)
else:
print('-1 -1')
else: # 两位数及以上
if 1 <= s <= 9 * m: # 每位数上的数字最大是9
ans_min = '0' * m
ans_max = '0' * m
# min
t = s
for i in range(m - 1, 0, -1):
t_min = min(9, t - 1) # 第一位不能为0,所以 t - 1
ans_min = ans_min[:i] + str(t_min) + ans_min[i + 1:] # python字符串不可变,故切片
t -= t_min
ans_min = str(t) + ans_min[1:]
# max
t = s
while t >= 9:
ans_max = ans_max.replace('0', '9', 1) # python字符串不可变,故用replace
t -= 9
ans_max = ans_max.replace('0', str(t), 1)
print(ans_min, ans_max)
else:
print('-1 -1')
# 此解并非最优解,只是个人认为比较好理解,请多多包涵
4.相关知识点复习
本题考察贪心算法,不多说啦。
一个小知识点:
- python字符串是不可变序列,不可以进行增删改操作。如果想修改某个值可以使用切片或者replace函数等
s = "python" s[0] = 'q' # × 错误写法 s = 'q' + s[1:] # √ 可使用切片完成对字符串中某个值的修改
引申:不可变序列与可变序列 (1)不可变序列:字符串、元组(没有增删改操作) (2)可变序列:列表、字典、集合(可以对序列执行增删改操作,对象地址不发生更改)
C AcWing 4808. 构造字符串
1.题目描述
2.思路分析
- 本题数据不大,可以暴力解决。
- 主要思路:判断字符串t的前缀和后缀有无相同(t[i:] 和 t[:-i]),得出相同的最大部分。之后就可以无限追加后半部分。
3.代码实现
n, k = map(int, input().split())
t = input() # sfrpmsfrpmsfrpmsfrpm
i = 1
while t[i:] != t[:-i]:
i += 1
print(t[:i] * k + t[i:])
如有帮助可以点赞收藏嘛~
如有不足或不解之处欢迎评论留言~