美文网首页算法数据结构和算法分析
Python算法之旅字符串游戏之拼接字符串

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

作者: 巧若拙 | 来源:发表于2020-03-12 22:05 被阅读0次

    字符串游戏之拼接字符串

            小美:阿福,最近老师教了我们一种很实用的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

    相关文章

      网友评论

        本文标题:Python算法之旅字符串游戏之拼接字符串

        本文链接:https://www.haomeiwen.com/subject/sijgjhtx.html