Python学习笔记(十):字符串实战(1)-《垂直柱状图》题解
目录
原题目链接
原题目:洛谷 P1598
解题思路
1.循环4次,每次输入内容添加到一个字符串内。
2.遍历字符串,对于每个字母,根据其ASCII码进行基数计数。同时找出出现的最高次数(maxn)。
3.从maxn开始递减,每次遍历所有基数,若次数大于等于当前的高度则输出星号。
举个例子:
上图:计数完毕后的图像
下图: 从maxn=7开始,向下一行一行地输出星号
4.输出完毕,输出最底层的字母A-Z。
这就是本题的基本解决思路了。但是依照原题,每行后不得有多余的空格。
接下来,就研究一下怎么在每行的时候按照要求输出了。
每行的输出
Python对于C++有个好处,就是可以更加方便地遍历列表。
于是,在每行,再次横向遍历26个基数,并检查当前的基数所对应的次数是否可以在本行输出星号。
在横向遍历26个基数的同时,再次遍历当前基数右侧的所有基数,
确保本行的输出是否到头(如果接下来没有满足条件的基数的话)。
改成图像就是:
代码实现
重要声明:抄袭、复制代码是非常恶劣的行为。此类行为将会导致您成为作弊者。代码仅供参考。
a='' #初始化字符串a
for i in range(4):
a+=input() #输入
maxn=0
sumn=list() #初始化存放计次的列表
for i in range(26):
sumn.append(0) #建立长度为26的列表,每个列表项都为0
for i in a: #遍历字符串
if 65<=ord(i)<=90: #如果当前字符的ASCII码显示其为大写字母
sumn[ord(i)-65]+=1 #计数
if sumn[ord(i)-65]>maxn:
maxn=sumn[ord(i)-65] #如果当前次数大于最大值,则更新
while maxn>=1: #遍历每行(上图可见)
for i in range(26): #遍历每个基数
wait=0 #存放右侧是否还有符合条件的基数的变量为wait
for o in range(i+1,26):
if sumn[o]>=maxn:
wait=1 #如果发现符合条件的,则将wait的值赋1
break
if wait==0 and sumn[i]>=maxn:
print('*')
continue
if wait==1 and sumn[i]>=maxn:
print('*',end=' ')
if wait==1 and sumn[i]<maxn:
print(' ',end=' ')#判断输出(上图可见)
maxn-=1
o=""
for i in range(65,91):
o+=chr(i)
if i!=91:
o+=" "
print(o) #输出最底一行字母