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:]))
希望这篇文章对你有帮助啦!
然的博客 Newsletter
Join the newsletter to receive the latest updates in your inbox.