【LeetCode】6. Z字形变换【模拟、找规律】

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;
    }
};

Guess you like

Origin blog.csdn.net/qq_43579980/article/details/117805424