Try   HackMD

6.Zigzag Conversion

tags: Medium,String

6. 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 <= s.length <= 1000
  • s consists of English letters (lower-case and upper-case), ',' and '.'.
  • 1 <= numRows <= 1000

解答

Python

class Solution: def convert(self, s: str, numRows: int) -> str: if numRows == 1: return s buf = [] for _ in range(numRows): buf.append( [ 0 for _ in range(len(s))] ) row,col = 0, 0 direction = 'down' for c in s: #print(row,col,direction) buf[row][col] = c if row == numRows-1: direction = 'up' row, col = row-1, col+1 elif row == 0: direction = 'down' row, col = row+1, col else: if direction == 'down': row, col = row+1, col else: row, col = row-1, col+1 result = '' for i in range(numRows): for j in range(len(s)): #print(buf[i][j], end='') if buf[i][j] != 0: result += buf[i][j] #print('') return result

玉山

C++

class Solution { public: string convert(string s, int numRows) { if (numRows == 1) return s; string ans; int step = (numRows - 1) * 2; for (int i = 0; i < numRows; i++) { for (int j = 0; j < s.size(); j += step) { int left = j + i; int right = j + step - i; if (left < s.size()) ans += s[left]; if (right < s.size() && left < right && right < j + step) ans += s[right]; } } return ans; } };

Yen-Chi ChenFri, Feb 3, 2023

Reference

回到題目列表