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 text, int nRows);
convert("PAYPALISHIRING", 3)
should return "PAHNAPLSIIGYIR"
.
这道题就是看坐标的变化,找规律并分块处理。参考:爱做饭的小莹子
规律:第一行和最后一行,就是按照2n-2的顺序一点点加的。斜着那条线的字的位置是当前列j+(2n-2)-2i(i是行的index)。
Java:
public String convert(String s, int nRows) { if(s == null || s.length()==0 || nRows <=0) return ""; if(nRows == 1) return s; StringBuilder res = new StringBuilder(); int size = 2*nRows-2; for(int i=0;i<nRows;i++){ for(int j=i;j<s.length();j+=size){ res.append(s.charAt(j)); if(i != 0 && i != nRows - 1){//except the first row and the last row int temp = j+size-2*i; if(temp<s.length()) res.append(s.charAt(temp)); } } } return res.toString(); }
Python:
class Solution(object): def convert(self, s, numRows): """ :type s: str :type numRows: int :rtype: str """ if numRows == 1: return s step, zigzag = 2 * numRows - 2, "" for i in xrange(numRows): for j in xrange(i, len(s), step): zigzag += s[j] if 0 < i < numRows - 1 and j + step - 2 * i < len(s): zigzag += s[j + step - 2 * i] return zigzag
C++:
class Solution { public: string convert(string s, int nRows) { if (nRows <= 1) return s; string res = ""; int size = 2 * nRows - 2; for (int i = 0; i < nRows; ++i) { for (int j = i; j < s.size(); j += size) { res += s[j]; int tmp = j + size - 2 * i; if (i != 0 && i != nRows - 1 && tmp < s.size()) res += s[tmp]; } } return res; } };
All LeetCode Questions List 题目汇总