很简单,不要忽略numRows=1的特殊情况处理。
approach 1:按结果顺序直接计算每个位置的下标
class Solution { public: string convert(string s, int numRows) { int a=0,b,x=2*numRows-2,p=0,len=s.length(); if (numRows==1) return s; string ans=""; while(a<len){ ans+=s[a]; a+=x; } for(int i=1;i<numRows-1;i++){ a=i;b=x-i; while(a<len){ ans+=s[a]; if (b<len) ans+=s[b]; a+=x;b+=x; } }//for a=numRows-1; while(a<len){ ans+=s[a]; a+=x; } return ans; }//covert };
approach 2:依次原字符串顺序依次读取每个位置,每行一个字符串,最后每行相加。
class Solution { public: string convert(string s, int numRows) { //if (s.size() == 0 || numRows <= 0) // return ""; if (numRows <= 1) return s; vector<string> lsts(numRows); string result; int index = 0, incr; for (int i = 0; i < s.size(); i++) { lsts[index] += s[i]; // cout << " test " << endl; if (index == 0) incr = 1; if (index == numRows - 1) incr = -1; index += incr; } for (int i = 0; i < lsts.size(); i++) result += lsts[i]; return result; } };