The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)P A H N A P L S I I G Y I R
And then read line by line: "PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string s, int numRows);
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3 Output: "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4 Output: "PINALSIGYAHRPI" Explanation: P I N A L S I G Y A H R P I
class Solution:
def convert(self, s: str, numRows: int) -> str:
if not s:
return s
if (numRows==1) or (len(s)<numRows):
return s
zigzeg = {}
for i in range(len(s)):
# ex) n = 5
# row_num str_idx cnt expression
# 0,1,2,3 0,1,2,3 0 r = s % (n-1)
# 4,3,2,1 4,5,6,7 1 r = (n+n-2)*(cnt+1)/2-s = (n-1)(cnt+1)-s
# 0,1,2,3 8,9,10,11 2 r = s % (n-1)
# 4,3,2,1 12,13,14,15 3 r = (n+n-2)*(cnt+1)/2-s = (n-1)(cnt+1)-s
# 0,1,2,3 16,17,18,19 4 r = s % (n-1)
# 4,3,2,1 20,21,22,23 5 r = (n+n-2)*(cnt+1)/2-s = (n-1)(cnt+1)-s
col_cnt = i//(numRows-1)
if col_cnt % 2 == 0:
r = i % (numRows-1)
# print(r)
else:
r = (numRows-1)*(col_cnt+1)-i
# print(r)
if zigzeg.get(str(r)) is None:
zigzeg[str(r)] = []
zigzeg[str(r)].append(s[i])
total = []
for i in range(numRows):
total += zigzeg.get(str(i))
# print(total)
# for j in zigzeg[str(i)]:
# print(j)
# total.extend(zigzeg[str(i)])
total = ''.join(total)
return total
'hacking or software engineering skills > leetcode' 카테고리의 다른 글
[leetcode] reverse_integer (python3) (0) | 2020.02.08 |
---|---|
7. Reverse Integer (0) | 2019.05.13 |
5. Longest Palindromic Substring (0) | 2019.05.09 |
4. Median of Two Sorted Arrays (0) | 2019.05.09 |
3. Longest Substring Without Repeating Characters (0) | 2019.05.09 |