【LeetCode】6. Z字形變換
阿新 • • 發佈:2018-11-12
題目連結: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;
}
};