题目大意
将一个给定字符串 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);
解题思路
- 这一题没有什么算法思想,考察的是对程序控制的能力。用 2 个变量保存方向,当垂直输出的行数达到了规定的目标行数以后,需要从下往上转折到第一行,循环中控制好方向
#include <iostream>
#include <vector>
#include <string>
string convert(string s,int nRows)
{
if(nRows<=1 || nRows>=s.size()) return s;
vector<string> r(nRows);
int row = 0;
int step = 1;
for(int i = 0;i<s.size();i++)
{
if(row == nRow - 1) step = -1;
if(row == 0) step = 1;
r[row] += s[i];
row += step;
}
string result;
for(int i = 0;i<nRows;i++)
{
result += r[i];
}
return result;
}
int main(int argc,char **argv)
{
string s;
int r;
s = "PAYPALISHIRING";
r = 3;
cout<<s<<":"<<convert(s,3)<<endl;
}