Z字形变换 leetcode 6

一.按行存储

1.解题思路

1.通过当前行的不断上下循环移动

2.将字符按序存放入vector中

3.最后再按行取出

2.代码及注释

class Solution {
public:
    string convert(string s, int numRows) {
        //如果行数等于1或者行数和字符长度相等则直接返回s;
        if(numRows==1||s.size()<=numRows) return s;
        
        /*
        1.用vector代替二维数组方便
        2.定义长度为行数
        */
        vector<string> rows(numRows);
        //当前从第零行开始
        int curRow = 0;
        //flag标志是向下还是向上进行->行移动 0为向下移动 1为向上移动

        int flag = 0;
        
        //循环将每个字符放入vector中 字符是按序进行而行数是上下循环进行
        for(int i=0;i<s.size();i++){
            //存放字符
            rows[curRow]+=s[i];
            /*
            1.当前行移动到最后一行时,改变flag从而开始向上移动
            2.当前行移动到第一行时,改变flag从而开始向下移动
            */
            if(curRow==numRows-1){
                flag = 1;
            }else if(curRow==0){
                flag = 0;
            }
            
            //上下移动
            if(flag==0){
                curRow++;
            }else{
                curRow--;
            }
            
        }
        //将字符按行取出 存放入t中
        string t="";
        for(string s:rows){
            t+=s;
        }
        return t;
    }

 

 

 

二.数学计算

 

1.解题思路

 

 

 

 

 

 

 

 

 

2.代码及注释

class Solution {
public:
    string convert(string s, int numRows) {
        //当行数为1或者字符串长度小于行数时直接输出s
        if(numRows==1||s.size()<numRows) return s;
        //定义all为跳转一次时移动的长度
        int all = (numRows-1)*2;
        /*
        w存储行数 当前行不为第一行和最后一行时用(w-1)*2计算两次跳转中
        第一次跳转时移动的长度
        */
        int w = numRows;
        //结果字符串
        string ans = "";
        //i代表当前行数
        for(int i=0;i<numRows;i++){
            int j=i;
            //当前行为第一行和最后一行时 重复加上跳转一次的长度即为all
            if(i==0||i==numRows-1){
                while(j<s.size()){
                    ans+=s[j];
                    j+=all;
                }
            }else{
                //当前行不为第一行和最后一行时,需要跳转两次
                int left = (w-1)*2;
                while(j<s.size()){
                    ans+=s[j];
                    //移动left
                    j+=left;
                    //考虑超越边界
                    if(j>=s.size()) break;
                    ans+=s[j];
                    //移动right
                    j+=all-left;
                }
            }
            //w更新每次减少1
            w--;
        }
        return ans;
    }
};
posted @ 2019-12-30 13:21  谋莽台  阅读(170)  评论(0编辑  收藏  举报