Cho chuỗi s và số dòng k. Viết chuỗi theo ziczac: chéo xuống đến dòng k, chéo lên đến dòng 1, lặp lại. Trả về chuỗi các dòng nối bằng xuống dòng.
Ví dụ: s="ilovepythonprogramming", k=5 → xuất ra hình ziczac.
Giải thuật
- Duyệt
s, biếncnt(dòng hiện tại) vàdelta(hướng: +1 xuống, -1 lên). - Khi
cnt == k: đổi hướng lên,cnt = k-2. - Khi
cnt == 0: đổi hướng xuống,delta = 1. - Gom ký tự theo dòng vào
line[cnt]kèm vị trí gốc. - Sau khi duyệt xong, xây dựng từng dòng: mảng khoảng trắng độ dài
len(s), điền ký tự tại vị trí gốc, nối thành chuỗi. - Nối các dòng bằng
\n.
Ví dụ minh họa
from collections import defaultdict
class Solution:
def solve(self, s, k):
line = defaultdict(list)
cnt = 0
delta = 1
for i, c in enumerate(s):
line[cnt].append((c, i))
cnt += delta
if cnt == k:
delta = -1
cnt = k - 2
if cnt == 0:
delta = 1
ans = []
for i, c in line.items():
prefix = [" "] * len(s)
for x, y in c:
prefix[y] = x
ans.append("".join(prefix))
return "\n".join(ans)
ob = Solution()
s = "ilovepythonprogramming"
k = 5
print(ob.solve(s, k))
Đầu vào
"ilovepythonprogramming", 5
Đầu ra
(xuất ra hình ziczac)