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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。