알고리즘 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
지그재그에 나열한 다음 각 행을
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();
}
Reference
이 문제에 관하여(알고리즘 1000 개 노크 #6. ZigZag Conversion), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/_rdtr/items/39e1ac3e30b8e705c00b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)