将一个给定字符串
s
根据给定的行数numRows
,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为
"PAYPALISHIRING"
行数为3
时,排列如下: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示例 3:
输入:s = "A", numRows = 1 输出:"A"提示:
1 <= s.length <= 1000
s
由英文字母(小写和大写)、','
和'.'
组成1 <= numRows <= 1000
确实是堆屎山,学习过程还是记录一下。
string convert(string s, int numRows) {
if (numRows == 1)return s;
int len = s.length();
char res[1001];
int iRow[1001];
int remain = len % (2 * numRows - 2);
int nums = len / (2 * numRows - 2);
for (int i = 1; i <= numRows; i++) {
if (i == 1 || i == numRows )
iRow[i] = nums;
else
iRow[i] = nums * 2;
}
for (int i = 1; i <= remain; i++) {
if (i <= numRows)
iRow[i]++;
else
iRow[2 * numRows - i]++;
}
for (int i = 1; i <= len; i++) {
int cur_remain = i % (2 * numRows - 2);
int cur_num = i / (2 * numRows - 2);
int cur_row = cur_remain <= numRows ? cur_remain : 2 * numRows - cur_remain;
if (cur_remain == 0) cur_row = 2;
int cur_idx;
if (cur_row == 1 || cur_row == numRows)
{
cur_idx = cur_num + 1;
if (numRows == 2 && cur_row == numRows)cur_idx = cur_num;
}
else {
cur_idx = 2 * cur_num;
if (cur_remain != 0) {
if (cur_remain <= numRows ) cur_idx++;
else cur_idx += 2;
}
}
for (int j = 1; j < cur_row; j++) cur_idx += iRow[j];
res[cur_idx - 1] = s[i - 1];
}
res[len] = '\0';
string res_str(res);
return res_str;
}