字符串游戏之拼接字符串
小美:阿福,最近老师教了我们一种很实用的Python数据结构——字符串,他说Python的字符串操作比其他编程语言都要简明自然呢。
阿福:是啊,Python语言的最大特征就是简明易懂,代码和自然语言接近,容易理解。
小美:老师给我们举了一个用字符串画五角星方阵的例子,我觉得很好玩,代码也很简洁呢。
阿福:是吗,那发给我瞧瞧吧。
题目1:
五角星方阵。
函数功能:生成大小为n的五角星方阵,其中n为奇数。
函数名:sort_1(a:str)->str
参数表:n -- 五角星方阵的大小。
返回值:直接输出方阵,没有返回值。
示例1:输入n=3时,生成五角星方阵:
☆★☆
★★★
☆★☆
示例2:输入n=5时,生成五角星方阵:
☆☆★☆☆
☆★★★☆
★★★★★
☆★★★☆
☆☆★☆☆
代码1:
def draw_stars(n:int)->None:
s = []
for i in range(1, n+1):
b = 2 * i - 1 if i <= n // 2 else 2 *(n - i) + 1#黑色五角星数量
w = (n - b) // 2#白色五角星数量
s.append("☆" * w + "★" * b + "☆" * w)
for i in s:
print(i)
阿福:确实是一个很棒的例子,利用Python字符串的”+”和”*”运算符,只需一重循环就完成了方阵的输出。这在其他编程语言中是很难办到的,充分体现了Python简洁明了的特性。
知识小贴士:
Python字符串运算符简介:
操作符”+”,用作字符串连接,例如a=”1”,b=”2”,则a+b的结果为”12”。
操作符”*”,用作重复输出字符串,例如a=”1”,则a*3的结果为”111”。
顺序拼接字符串,例如a=”1”,b=”2”,则执行a=a+b后,a=”12”。
逆序拼接字符串,例如a=”1”,b=”2”,则执行a=b+a后,a=”21”。
古老师:一段时间不见,大家长进都不小!已经对字符串有了比较深刻的认识了。今天我就来考查一下,看看你们对字符串拼接操作的熟练度如何。
小美:好啊,在家憋了好长一段时间了,正想释放一下大脑的压力呢。
题目2:
字符串拼接练习1。
将一个存储了非递减序列的字符串a中的字符转存到字符串b中,使得字符串b的字符呈现中间小,并逐次向两边增大的特征。
函数功能:将存储了非递减序列的字符串a中的字符转存到字符串b中,使得字符串b的字符呈现中间小,并逐次向两边增大的特征。
函数名:sort_1(a:str)->str
参数表:a -- 存储了非递减序列的字符串a。
返回值:转换后的字符串b。
示例1:当a="12345678"时,b="75312468"。
示例2:当a="123456789"时,b="975312468"。
小美:这道题目比五角星方阵要难呢,需要先找到字符串b拼接的规律。
阿福:是的,我注意到字符串b拼接的规律是左-右-左-右交替进行的。
小美:没错,我也看到了。我还画了一幅示意图,你看对不对。
阿福:真棒!正是这样。有了示意图,代码就好写多了。
代码2:
def sort_1(a:str)->str:
b = ""
for i, c in enumerate(a):
if i % 2 == 0:
b = c + b
else:
b = b + c
return b
古老师:不错不错!看来你已经领会到字符串拼接操作的精髓了。不知道你们注意到没有,我刚才给自定义函数取名为sort_1。其实它还有一道姊妹题,一并发给你们吧。慢慢思考,我有事先走了。
题目3:
字符串拼接练习2。
将一个存储了非递减序列的字符串a中的字符转存到字符串b中,使得字符串b的字符呈现中间小,并逐次向两边增大的特征。
函数功能:将存储了非递减序列的字符串a中的字符转存到字符串b中,使得字符串b的字符呈现中间小,并逐次向两边增大的特征。
函数名:sort_2(a:str)->str
参数表:a -- 存储了非递减序列的字符串a。
返回值:转换后的字符串b。
示例1:当a="12345678"时,b="75312468"。
示例2:当a="123456789"时,b="864213579"。
彩蛋:
小美:什么姊妹题啊?看上去一模一样啊。
阿福:字符串a的长度为偶数时,二者确实一模一样,但长度为奇数时,二者还是有区别的。
小美:哦,原来是这样。我看出来了!它的规律是这样的:
阿福:小美不错啊,这么快就发现规律了!那代码怎么写呢?
小美:这个很简单,只需要先判断一下字符串的长度是否为奇数,如果是奇数需要把a[0]放在最中间,然后按照左-右,左-右的顺序依次拼接字符串就行了。
代码3:
def sort_2(a:str)->str:
b, begin = "", 0
if len(a) % 2 == 1:
b, begin = a[0], 1
for i in range(begin, len(a), 2):
b = a[i] + b + a[i+1]
return b
阿福:这个方法确实不错,但是没必要从中间开始拼接字符串。我发现无论字符串的长度如何,新字符串总是把最大值放在右端,次大值放在左端,然后依次向中间缩进。规律如图所示:
小美:还真是这样呢,阿福你的观察力可以啊!那就请把代码也一起写出来吧。
阿福:没问题,只要设置两个变量bL和bR,分别存储左右两侧的字符,然后拼接起来就行了。循环结构可以模仿sort_1函数的做法。
代码4:
def sort_2(a:str)->str:
bL, bR = "", ""
for i, c in enumerate(a[::-1]):
if i % 2 == 0:
bR = c + bR
else:
bL = bL + c
return bL + bR
网友评论