ZigZag Conversion

Bài toán này nếu không có Leetcode hiện case mỗi lần commit sai thì không biết tôi có AC nổi không. Vậy sau này đi phỏng vấn thì thế nào :((

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
nd 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
Giả sử trong ví dụ 2, tôi chuyển những đường ZigZag chéo sang cột, thì nhìn sẽ như thế này:
                                                                   P   I   N
                                                                   A  S  G
                                                                   Y  H
                                                                   P   I
                                                                   A  R
                                                                   L  I
Nếu vậy thì mỗi cột có chiều dài tối đa max = numRows*2-2 ký tự. Ở ví dụ trên là 6.

Lại để ý sẽ thấy một quy luật. Đường ZigZag có numRows = 4 (0,1,2,3). Hàng 0 và 3 không bao giờ có sự xuất hiện của phần tử chéo. Còn lại, giả sử như đang ở cột 1, phần tử đầu tiên là A vị trí 1: A(1), phần tử tiếp theo là L(5), phần tử tiespe theo là S(vị trí 7). 

Nhận thấy ở đây phẩn tử L(5) là của đường chéo, nó bằng vị trí thứ 7 - 2 . Sau một hồi tìm logic tương tự cho các cột sau, thì ta rút ra là: phần tử chéo chính là: iter+6 - i*i . (Xem code để hiểu hơn).


Trên đây là implement bằng Java. Cảm ơn bạn !

Nhận xét

Bài đăng phổ biến từ blog này

Hiểu về Norm Regularization

Faceswap & state-of-the-art (SOTA)