女娲补天之字符串
补基础捏~,一些细节都在题目里
刷题列表:
洛谷 P5733 【深基6.例1】自动修正
这里用到了py的两个函数:
字符串s = asDISDsdj
1. 字符串所有字母小写转大写:s.lower()
2. 字符串所有字母大写转小写:s.upper()
其实在输入的时候就可以一边输入一遍转化大小写,如下所示
s1 = input().lower()
s2 = input().upper()
洛谷 P1914 小书童——凯撒密码
这里用到了字符和ACSCII码相互转换的函数。
1. 字符转ASCII码:n = ord('a')
2. ASCII码转字符:n = chr(97)
常用的字符ASCII码:ord('a') = 97
,ord('z') = 122
,chr(65) = 'A'
,chr(90) = 'Z'
所以本题只需要求出每个字符的ASCII码并移动$n$位,如果大于$Z$的ASCII码($122$),减去$26$,再用chr
函数转回字符输出即可。
洛谷 P1125 笨小猴
将每个字符转为对应的ASCII码存储,这里映射到了数组下标0-25上。
由于这里的数据范围很小,可以直接把100以内的质数写出来直接查找即可。
注意:求最小值的时候,0-25可能存在0,即在当前字符串中没有出现过的字符,这个不能当作最小值,所以需要多一个判断。
if f[i] > 0: min_val = min(f[i], min_val)
洛谷 P1957 口算练习题
分别求出三项的长度再加上两个符号的长度即可。
这里用到了py的格式化输出(format
),format
采用位置匹配,在需要输出参数的地方打上花括号,再在后面括号内的对应位置写上即可。
print('上海海事大学是{}'.format('大专'))
结果:上海海事大学是大专
print('{}+{}={}'.format(1, 2, '海事'))
结果:1+2=海事
注意:前面引号内是花括号{}
,.format
后面是圆括号()
洛谷 P5015 标题统计
这个好像用py做特别简单,循环整个输入的字符串,只要不是空格,res += 1
,输出答案即可。
P5734 【深基6.例6】文字处理软件
在C++
这里会用到一些字符串处理函数,但是在py中,字符串是不能更改的,所以所有需要修改字符串的一般都要转化到列表list
中进行修改。
但本题没有涉及对字符串具体某个位置上值的修改,所以主要用到字符串切片等一些操作。
1.原字符串后加入一个新的字符串
py的字符串可以直接用+=
,在原字符串后面加入新的(注意需要二者都是字符串)。
2.截取原字符串
除了list
以外,py中字符串也可以进行切片操作(具体操作和list
一样),得到的仍然是字符串。
s = s[a:a+b]
,仍然是从左端点切到右端点$-1$的位置
3.在原字符串中插入新字符串
需要用到两次切片操作和字符串拼接操作。
st = st[0:a] + ls[2] + st[a:k]
,这里k
是字符串长度
众所周知字符串最后一位的下标是$-1$,但为什么如果改成st = st[0:a] + ls[2] + st[a:-1]
就错了呢?
还是因为这里切片是左闭右开(左端点切到右端点$-1$的位置),如果改成$-1$,变成从第$a$个位置的字符切到倒数第二个字符,不符合题意,但st[0:a]
却可以,因为左端点是闭合的hhh
那么如果想从某个点切到字符串(列表)的最头上/最末尾,只要直接空着就好了
上面切片操作省略为st = st[:a] + ls[2] + st[a:]
特殊截取:
感觉直接都是被特殊截取骗了才老是想着最后一位写$-1$
s = s[::-1]
,s
与原字符串完全相反
4.在原字符串中查找子串最先输出的位置
这里用到find()
函数。
s.find(s1)
, 从下标0开始,查找在字符串S
里第一个出现的子串的开始下标,如果不存在返回$-1$。
s.find(s1, 4)
,从下标4开始,查找在字符串S
里第一个出现的子串的开始下标,如果不存在返回$-1$。
s.find(s1, 4, 10)
,从下标4开始,下标9结束,查找在字符串S
里第一个出现的子串的开始下标,如果不存在返回$-1$。
洛谷 P1308 统计单词数
首先在输入的时候需要把所有单词统一大写或小写。
本题第一问看似只需要用一个find()
函数即可,第一个样例也过了(永远不能相信样例)。
但注意find()
函数才不管这个单词是不是完整的单词,只要子串出现了就会返回,和这里的题意不相符。
这里用了一个比较神奇的方法。
由于完整的单词左右两边都是空格,那么把原字符串和字串左右个加上一个空格' '
,这样在匹配的时候,就可以用find()
函数了,不用担心是否只是单词的一部分。
aim_1 = ' ' + aim + ' '
st_1 = ' ' + st + ' '
统计次数只需要转化为列表然后统计相等的数量就可以。
洛谷 P1765 手机
按照图示统计每次字母的案件次数即可,注意7和9对应的都是4个字母,剩余都是3个。
洛谷 P3741 honoka的键盘
没想到这题也卡了好久hhh
对于已经被计算的VK
,就不能再动了,不然就算改了之后多了一个新的VK
,原来这个`VK也没了,一加一减,相当于没有变化。
既然每个VK
被计算后都独立且不会再被改变,那么将其丢弃再找剩下的里面有没有VV
或KK
存在即可。
是否可以直接删除呢?肯定不行,如果原来是VKVVKKVK
(VK V VK K VK
),删除里面三个VK
,剩下一个新的VK
,很明显是非法的。
那如何让已经被计算过的VK
不再纳入最后新的KK
或VV
的寻找,模仿上一题,每次找到VK
后,在其前后各加上一个空格' '
,注意一定要前后都加上。
w = w[:r] + ' ' + w[r:r + 2] + ' ' + w[r + 2:]
这样最后只要看字符串中是否存在VV
或KK
即可。
洛谷 P1321 单词覆盖还原
这题最开始都没懂,看了题解才发现自己没动脑子。
题目中“每个单词至少有一个字符没有被覆盖”,那么只要在这个字符串的范围内,出现了这个单词的某个字母,就代表这个范围有一个单词。
并且本题中girl
和boy
没有重复单词,没有奇怪的情况。
并且为了避免重复计算,每次就当单词都是全部出现的来计算,这段代码真有点妙捏。
if a[i] == 'b' or a[i + 1] == 'o' or a[i + 2] == 'y':
res_boy += 1
if a[i] == 'g' or a[i + 1] == 'i' or a[i + 2] == 'r' or a[i + 3] == 'l':
res_girl += 1
洛谷 P1553 数字反转(升级版)
本题不难,但就是太繁琐了,这几个$0$卡了我半天。
主要在于特殊情况$0$的处理:
1. 整数可能是$0 $
2. 小数的整数部分是$0$
3. 小数的小数部分是$0 $
4. 分数的分子是$0 $
5. 百分数是$0$
这里用到了join()
,lstrip()
,rstrip()
和strip()
四个函数。
1.join()
一般用于将数组元素拼接成字符串,前一个' '
表示用什么将元素连接起来(' '
内不写内容就直接输出没有空格),join()
的括号内是list
名。
st = ['e', 'r', 'sa', 'sd']
print(''.join(st)
结果:
ersasd
2.strip(),lstrip(),rstrip()的作用与区别
是 Python 字符串对象的三个方法,它们都可以用来去除字符串的开头或结尾的空格或指定的字符。
s.strip('指定字符')
:用来去除字符串开头和结尾的指定字符
s.lstrip('指定字符')
:用来去除字符串开头的指定字符
s.rstrip('指定字符')
:用来去除字符串结尾的指定字符
如果指定字符是由多个字符组成的,并不是将整个指定字符串看成一个组合,而是删除每个单个字符。
比如
txt = "000%banana,,,,,ssqqqww....."
x = txt.strip('.0%')
print(x)
结果:去掉了原字符串左侧的0
和%
,以及原字符串右侧的’.’。
banana,,,,,ssqqqww
洛谷 P1603 斯诺登的密码
本题的点在于最后拼接的时候除了第一个以外,其余的$0$都要补上。
我想的是,用一个元组存储三个元素,(这个数本身,十位和个位),再将每个元组存入列表中。
首先判断列表内是否有元素,没有直接输出0
并退出exit()
。
经过排序后,只要特殊判断一下第一个元组的第一个元素是否是个位数,如果是就不用补十位,用个位当开头,然后按照列表排序分别把每个数的十位和个位分别接到答案上。
注意这里用的是字符串的拼接,需要把每个int
变成str
型。
if res[0][1] == 0:
st = str(res[0][2])
else:
st = str(res[0][1]) + str(res[0][2])
for i in range(1, n):
st += str(res[i][1]) + str(res[i][2])
洛谷 P1200 你的飞碟在这儿Your Ride Is Here
使用ord()
函数求出每个字母的ASCII码并对应到1-26上求解即可。
P1598 垂直柱状图
细节题,统计字母出现次数,根据数量排版画图
tql
全是入门题qaq
强基计划 正式启动!