将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
题目理解如下图所示:形状相当于将Z字先向右镜像在顺时针旋转90度
思路:
1)用vector容器来创建字符串数组;
2)对字符串s进行遍历,用vector数组按照Z字形变换来存储s中的单个字符。具体操作请看代码;
3)遍历输出vector字符串数组。
补充知识点:
bool类型的数据在进行加减法操作时,当它为false,其值为0;当它为true,其值为1。
string convert(string s, int numRows) {
int len = s.size();
if(numRows == 1) //如果numRows为1,则直接返回s。
return s;
string res = "";
vector<string> rows(min(len, numRows)); /*用vector容器创建字符串数组rows用来存储各个子串。
rows[cur]表示第cur个子串,
rows[cur][i]表示第cur个子串的第i个字符 cur和i都是从0开始*/
bool goingdown = false; /*goingdown的作用是用于反转的,当cur为0或numRows-1时,这是就需要反转了。*/
int cur = 0;
for(char c: s){ //遍历s中的每个字符c
rows[cur] += c; //存储字符串
if(0 == cur || numRows-1 == cur) //当cur为0或numRows-1时,这是就需要反转了
goingdown = !goingdown;
cur += goingdown? 1:-1; //当goingdown为true,cur+= 1,当goingdown为false,cur+= -1
}
for(string r : rows) //遍历rows中的每个字符串
res += r;
return res;
}