6. ZigZag Conversion
package LeetCode_6 /** * 6. ZigZag Conversion * https://leetcode.com/problems/zigzag-conversion/ * 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 Example 3: Input: s = "A", numRows = 1 Output: "A" Constraints: 1. 1 <= s.length <= 1000 2. s consists of English letters (lower-case and upper-case), ',' and '.'. 3. 1 <= numRows <= 1000 * */ class Solution { /* * solution: Array + StringBuilder, * Time complexity:O(n)(each letter access one time), Space complexity:O(n), n is length of s, * */ fun convert(s: String, numRows: Int): String { val stringBuilders = Array(numRows) { StringBuilder() } val len = s.length var index = 0 while (index < len) { var row = 0 while (row < numRows && index < len) { /* * for example: PAYPALISHIRING * stringBuilders[0].append(P) stringBuilders[1].append(A) stringBuilders[2].append(Y) stringBuilders[0].append(P) stringBuilders[1].append(A) stringBuilders[2].append(L) .... * */ stringBuilders[row].append(s[index++]) row++ } //diagonally upward starting from stringBuilders[numRows-2] and stop at stringBuilders[1] var j = numRows - 2 while (j >= 1 && index < len) { stringBuilders[j].append(s[index++]) j-- } } //merge all into StringBuilder 1 for (i in 1 until stringBuilders.size){ stringBuilders[0].append(stringBuilders[i]) } //println(stringBuilders[0].toString()) return stringBuilders[0].toString() } }