1. 程式人生 > >【LeetCode】6. Z字形變換

【LeetCode】6. Z字形變換

題目連結https://leetcode-cn.com/problems/zigzag-conversion/description/

題目描述

將字串 “PAYPALISHIRING” 以Z字形排列成給定的行數:

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

之後從左往右,逐行讀取字元:“PAHNAPLSIIGYIR”

實現一個將字串進行指定行數變換的函式:

string convert(string s, int numRows);

示例1

輸入: s = “PAYPALISHIRING”, numRows = 3
輸出: “PAHNAPLSIIGYIR”

示例2

輸入: s = “PAYPALISHIRING”, numRows = 4
輸出: “PINALSIGYAHRPI”
解釋:

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

解決方法

規律:第一行和最後一行的字母下標數是一個等差數列,差值為d=2*numRows-2;其他行的把滿列的和單列的數字分成兩部分來看,滿列的依然是差值為d的等差數列,單列的值為pos+d-2*i(pos是前面一個整列數字的位置,i是行數)

class Solution {
public:
    string convert(string s, int numRows) {                
        if
(numRows<=1) return s; //特殊情況 string result; int d=2*numRows-2; for (int i=0;i<numRows;i++){ //從第一行遍歷到最後一行 for (int pos=i;pos<s.size();pos+=d){ //第一行、最後一行數字和其他行的整列數字 result+=s[pos]; //其他行的單列數字 int
tmp=pos+d-2*i; if (i!=0 && i!=numRows-1 && tmp<s.size()) result+=s[tmp]; } } return result; } };