Leetcode-1 有意思的N/Z字符串

1. 这道题的本意是字符串访问顺序的转换,类似于树的各种顺序互相转换方式;

2. 最简单的方法就是直接找规律,然后写代码实现,将原本的N字符打印方式转换成正常顺序,再输出;

代码如下

 

class Solution {
public:
    string convert(string s, int numRows) {
        string ans = s;
        int size = s.size();
        if(numRows==1){
            return ans;
        }
        //计算列数
        int numCols= (size/(numRows+numRows-2))*(1+numRows-2);
        int m=size%(numRows+numRows-2);
        //若为竖着的一列
        if(m<numRows+1){
            numCols+=1;
        }
        else{//加上多出的列
            numCols+=1+(m-numRows);
        }
        vector<vector<int> > a3(numRows,vector<int>(numCols));
        for(int i=0;i<numRows;i++){//初始化,保存s中每个字母的横纵坐标
            for(int j=0;j<numCols;j++){
                a3[i][j] = -1;
            }
        }
        for(int i =0; i< size; i++){
            int row = 0;
            int col = 0;
            //
            int k= i%(numRows+numRows-2);
            int j=i/(numRows+numRows-2);
            if(k<numRows){
                row = k;
                col = j*(numRows-2+1);
            }
            else{
                row = numRows - 1 - (k-numRows)-1;
                col = j*(numRows-2+1)+(k-numRows)+1;
            }
            a3[row][col]=i;
        }
        int ptr=0;
        //按照横纵坐标找到变换后的字符串
        for(int i=0;i<numRows;i++){//初始化
            for(int j=0;j<numCols;j++){
                if(a3[i][j]!=-1){
                    int num = a3[i][j];
                    ans[ptr]=s[num];
                    ptr++;
                }
            }
        }
        return ans;

    }
};

当然这个方法比较笨,主要是没想到每一行中那些空缺元素怎么办,实际上可以用一个string直接保存每行的字母,直接+=即可;(在求到横坐标的时候就可以停了,直接对应行的string+=当前字母,因为列肯定是按顺序的)

官方的另一个优化就是在行的判断上,挺有意思的,上下的方向转换很有趣,见代码

class Solution {
public:
    string convert(string s, int numRows) {

        if (numRows == 1) return s;

        vector<string> rows(min(numRows, int(s.size())));
        int curRow = 0;
        bool goingDown = false;

        for (char c : s) {
            rows[curRow] += c;
            if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
            curRow += goingDown ? 1 : -1;
        }

        string ret;
        for (string row : rows) ret += row;
        return ret;
    }
};


作者:LeetCode
链接:https://leetcode-cn.com/problems/zigzag-conversion/solution/z-zi-xing-bian-huan-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted on 2020-08-01 16:33  二环  阅读(144)  评论(0编辑  收藏  举报