1.题目链接
点击这里
2.解题思路
对于只有一个字符的情况,直接输出即可。
对于由一个以上字符的情况:可以发现每步迭代都是由“画成一条竖线”和“从左下方到右上方画一条直线”构成的,而且这两条线的长度都是numRows-1。
结合我们的发现,模拟的大体框架已经出来了。接下来是细节处理:线没画完时就结束了怎么办?其实可以用最简单粗暴的办法,直接跳出循环,不画了。
3.代码
class Solution {
public:
string convert(string s, int numRows) {
char res[1010][1010];
memset(res,' ',sizeof(res));
int cnt=0;//cnt表示Z变换后的列
if(numRows>1){
for(int i=0;i<=(int)s.size()-1;){
bool flag=false;
//1.画竖
for(int j=0;j<numRows-1;j++){
res[j][cnt]=s[i++];
if(i>=(int)s.size()){
//画完了
flag=true;
break;
}
}
if(flag) break;
//2.从左下到右上
int k=numRows-1;//控制在每列的某个位置填入
for(int j=cnt;j<cnt+numRows-1;j++){
res[k][j]=s[i++];
k-=1;
if(i>=(int)s.size()){
//画完了
flag=true;
break;
}
}
cnt+=numRows-1;
if(flag) break;
}
}
string ans="";
if(numRows==1) ans+=s;
else{
for(int i=0;i<numRows;i++){
for(int j=0;j<=cnt;j++){
if(res[i][j]!=' ')
ans+=res[i][j];
}
}
}
return ans;
}
};