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)                      #输出最底一行字母

猜你喜欢

转载自blog.csdn.net/Commander_WingT/article/details/89405795
今日推荐