HackerRank: Alphabet Rangoli 笔记和题解

HackerRank Alphabet Rangoli 笔记和题解。

然

Table of Contents

简介

这道题是做到 HackerRank 的 Alphabet Rangoli 时写下的,虽然很快就写出了答案,但是写得非常粗糙,也不够简洁,参考了一下 Discussion 和 Editorial 之后做了一下优化。

题目

题目要求给定一个整数 $N$ (叫做 size),$0 < size < 27$,要求输出类似下面这样得 ASCII art:

#size 3

----c----
--c-b-c--
c-b-a-b-c
--c-b-c--
----c----

#size 5

--------e--------
------e-d-e------
----e-d-c-d-e----
--e-d-c-b-c-d-e--
e-d-c-b-a-b-c-d-e
--e-d-c-b-c-d-e--
----e-d-c-d-e----
------e-d-e------
--------e--------

所以 size 决定了最外围的字母,也就是中间那行要从 a 数到第几个。

题解

一开始的想法

我一开始的想法是这样:

def print_rangoli(size):
    l = "abcdefghijklmnopqrstuvwxyz"
    result = []
    for i in range(size,0,-1):
        s = l[size-i:size][::-1]+l[size-i+1:size]
        s = "-".join(s)
        result.append(s)
    for i in result[::-1]:
    	print(i.center(4*size-3,'-'))
    for j in result[1:]:
    	print(j.center(4*size-3,'-'))

自己打了个字母 string 哈哈哈。打算从中间那行开始打出需要的字母排列,再插入"-" 去将其连接起来,因为其它的行数都可以看作是这行的缩减。

for i in range(size,0,-1):
    s = l[size-i:size][::-1]+l[size-i+1:size]
    s = "-".join(s)
    result.append(s)
    print(s)

size 为 $5$ 的情况下,这一部分的输出就是:

e-d-c-b-a-b-c-d-e
e-d-c-b-c-d-e
e-d-c-d-e
e-d-e
e

接着再将存在 result 里的这些 string 补上 center 打出来。当然这样其实是有点繁琐的。

(对 center() 的功能不熟悉的朋友可以看一下这篇笔记。)

补充一句,下面这行代码用到的技巧叫做 Extended Slices,用来将 list 反转。

result[::-1]

如何算出 4n-3

关于如何算出 $4n-3$,也就是中间行的总字符数。首先中间的字母数是 (n + (n-1)) = 2n-1 个, 然后加上 "-" 的个数:2n-1 + (2n-1-1) = 4n-3

优化解法

在看了 Discussion 和 Editorial 的解答后,将代码修改为了以下这样:

def print_rangoli(size):
	# your code goes here
    l = "abcdefghijklmnopqrstuvwxyz"
    result = []
    for i in range(size):
        s = l[i:size][::-1]+l[i+1:size]
        s = "-".join(s).center(4*n-3,'-')
        result.append(s)
    print("\n".join(result[::-1]+result[1:]))

用 "-" join 的时候顺便 center,打印的时候将 list 拼起来再用 "\n" 进行 join。这样代码简洁了不少,而且将 range(size,0,-1) 改成了 range(size),因为一开始的想法有点问题,被自己影响了。

当然,其实不需要自己手打字母字符串哈哈:

import string
l = string.ascii_lowercase

def print_rangoli(size):
    result = []
    for i in range(size):
        s = l[i:size][::-1]+l[i+1:size]
        s = "-".join(s).center(4*n-3,'-')
        result.append(s)
    print("\n".join(result[::-1]+result[1:]))

希望这篇文章对你有帮助啦!

HackerRankPython简单难度算法

Comments