Python算法之旅字符串游戏之拼接字符串

字符串游戏之拼接字符串

        小美:阿福,最近老师教了我们一种很实用的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拼接的规律是左-右-左-右交替进行的。

        小美:没错,我也看到了。我还画了一幅示意图,你看对不对。


Python算法之旅字符串游戏之拼接字符串_第1张图片

        阿福:真棒!正是这样。有了示意图,代码就好写多了。


代码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的长度为偶数时,二者确实一模一样,但长度为奇数时,二者还是有区别的。

         小美:哦,原来是这样。我看出来了!它的规律是这样的:

Python算法之旅字符串游戏之拼接字符串_第2张图片

         阿福:小美不错啊,这么快就发现规律了!那代码怎么写呢?

         小美:这个很简单,只需要先判断一下字符串的长度是否为奇数,如果是奇数需要把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

          阿福:这个方法确实不错,但是没必要从中间开始拼接字符串。我发现无论字符串的长度如何,新字符串总是把最大值放在右端,次大值放在左端,然后依次向中间缩进。规律如图所示:

Python算法之旅字符串游戏之拼接字符串_第3张图片

          小美:还真是这样呢,阿福你的观察力可以啊!那就请把代码也一起写出来吧。

          阿福:没问题,只要设置两个变量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

你可能感兴趣的:(Python算法之旅字符串游戏之拼接字符串)