알고리즘 1000 개 노크 #6. ZigZag Conversion

Problem



문제는 LeetCode에서 빌리고 있지만, 예제를 보는 한 Paypal의 인터뷰에서 출제 된 것이 있다고 추측됩니다.
文字列 "PAYPALISHIRING" を3行のジグザグ状に羅列すると以下のようになる

P   A   H   N
A P L S I I G
Y   I   R

これを行ごとに読むと次のようになる: "PAHNAPLSIIGYIR"
同じ要領で, 元の文字列と行数を与えられた時にジグザグ状に羅列して行ごとに読んだ時の
文字列を出力する関数を記述せよ.

string convert(string text, int nRows);

convert("PAYPALISHIRING", 3) は "PAHNAPLSIIGYIR" を返却する.

Solution



example1

지그재그에 나열한 다음 각 행을 t0 , t1 , t1 .

파이썬 버전 코드:
class Solution(object):
    def convert(self, s, numRows):
        leng = len(s)
        if leng == 0:      return ''
        if numRows <= 0:   return ''
        elif numRows == 1: return s

        resRows = [''] * numRows

        i = 0
        resRowNum = 0
        step = 1
        while i < leng:
            resRows[resRowNum] += s[i]

            if (step == 1 and resRowNum == numRows - 1) or (step == -1 and resRowNum == 0):
                step = -1 * step

            resRowNum += step
            i += 1

        return ''.join(resRows)

계산량 : t0, t1, t2, t1, t0, t1, ...) , 공간량 : O(M) (M은 주어진 문자열의 길이).

Java 버전 코드:
public class Solution {
    public String convert(String s, int numRows) {
        int len = s.length();
        if (len == 0 || numRows == 0) return "";
        if (numRows == 1) return s;

        StringBuilder[] resRows = new StringBuilder[numRows];
        for (int i = 0; i < numRows; i++) {
            resRows[i] = new StringBuilder();
        }

        int rowIdx = 0;
        int step = 1;
        for (int i = 0; i < len; i++) {
            resRows[rowIdx].append(s.charAt(i));
            if ((step == 1 && rowIdx == numRows - 1) || (step == -1 && rowIdx == 0)) {
                step = -1 * step;
            }
            rowIdx += step;
        }

        StringBuilder sb = new StringBuilder(resRows[0]);
        for (int i = 1; i < numRows; i++) {
            sb.append(resRows[i]);
        }

        return sb.toString();
    }

좋은 웹페이지 즐겨찾기