(蓝桥杯 BASIC-3 循环 字符串)


前言

  大概是最后一次参加蓝桥杯,Python组模拟题练习,仅作为个人总结,分享给有需要的人,如有错误,请纠正,万分感谢


问题描述

利用字母可以组成一些美丽的图形,下面给出了一个例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

输入格式

输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。

输出格式

输出n行,每个m个字符,为你的图形。


样例输入

5 7

样例输出

ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC

数据规模与约定

1 <= n, m <= 26。
时间限制:1.0s 内存限制:256.0MB


一、 解答

1. 剖析:

  1. 本题先对第一行第一列从A进行延伸,
    即如果是4行3列,则先定位:
    ABC
    B
    C
    D
    如果是3行4列,则先定位:
    ABCD
    B
    C
    然而可以发现,我们可以列一个字母表,里面包含所有需要用到的字母,字母表的长度由行数和列数中最大的一个数字决定
  2. 其次,从第二行开始的每一行用上一行的除去最后一个字母进行补齐

2. 代码:

 a=list(map(int,input().split()))    #a[0]代表行数,a[1]代表字母数

 b=[]
 if a[0]>=a[1]:
     max=a[0]                        #取最大的数,就能确定字母表最后一个字母是什么
 else:
     max=a[1]
 for i in range(max):
            #A的ASCII码是65,以此类推,多少个字幕往后加就是了 
     b+=chr(65+i)                   #b存放字母列表
 t=b[:a[1]]
 print("".join(t))                  #列表转化为字符串输出
 if(a[1]==1):
     for i in range(a[0]-1):
         print(b[i+1])
 else:
     for i in range(a[0]-1):
         t=[b[i+1]]+t[:-1]          #因为单独一个b[i+1]是个字符串,t[:-1]是列表,类型不一致,所以需要加[]在其外
         print("".join(t))         

3. 重点知识:

  1. A的ASCII码是65,ASCII码转换为符号利用chr(ASCII码)
  2. 列表转化为字符串输出方式:print("".join(列表))

二、易错点及原因

(注意:以下程序有部分思想或内容一定是错的,正确的在上方代码)

  a=list(map(int,input().split()))#a[0]是行数,a[1]是字母数
     #A的ASCII码是65,以此类推,多少个字幕往后加就是了 
  b=[] 
  for i in range(a[1]):
          b+=chr(65+i)#存放字幕列表
          t=b 
  for i in range(a[0]):
         print("".join(t))#列表转化为字符串
         t=[b[i+1]]+t[:-1]#因为单独一个b[i+1]是个字符串,类型不一致

在这里插入图片描述
IndexError: list index out of range
原因:当输入为1 1时,在第9步,b[i+1]和t[:-1]根本取不到
进行更改:

 a=list(map(int,input().split()))#a[0]是行数,a[1]是字母数
 #A的ASCII码是65,以此类推,多少个字幕往后加就是了
 b=[]
 for i in range(a[1]):
     b+=chr(65+i)#存放字幕列表
     t=b
 
 print("".join(t))#列表转化为字符串
 for i in range(a[0]-1):
     t=[b[i+1]]+t[:-1]#因为单独一个b[i+1]是个字符串,类型不一致
     print("".join(t))#列表转化为字符串

问题: 只是修改了输入1 1的bug,当我这样如果输入5 1时,结果还是IndexError: list index out of range
原因:当输入为5 1时,在第9步,b[i+1]和t[:-1]根本取不到
进行更改:

 a=list(map(int,input().split()))#a[0]是行数,a[1]是字母数
 #A的ASCII码是65,以此类推,多少个字幕往后加就是了
 if(a[1]==1):

    for i in range(a[0]):
        print('A')
else:
    b=[]
    for i in range(a[1]):
        b+=chr(65+i)#存放字母列表
        t=b

    print("".join(t))#列表转化为字符串

    for i in range(a[0]-1):
        t=[b[i+1]]+t[:-1]#因为单独一个b[i+1]是个字符串,类型不一致
        print("".join(t))#列表转化为字符串

问题: 这种思想本质上不正确,题目的意思是第一行第一列都是从A开始延伸,而我这样如果输入5 1,本应依次每行分别出现A B C D E,结果则每行分别出现A A A A A
方法:需要取得行数和列数中最大的一个数字才可以定位整个需要输出的字母表范围。


有心上人就大胆爱,想学习就痛痛快快学,sincerely,end.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值