找规律 , 除了一行 和 两行需要特殊处理之外,其他的规律是一样的。 /* class Solution { public: string convert(string s, int numRows) { int len = s.size(); string ret_str(s); if(numRows == 1){ return ret_str; } if(numRows == 2){ int i = 0; for(; i < (len+1)/2; i++){ ret_str[i] = s[i*2]; } for(int j = 0;i+j < len;j++){ ret_str[i+j] = s[j*2 + 1]; } return ret_str; } int between_Z = 2*numRows - 2; int index =0; for(int i = 0;i < numRows; i++){ int initial_num = i; int mul = 0; while(initial_num + mul*between_Z < len){ ret_str[index] = s[initial_num + mul*between_Z]; if( i != 0 && i != numRows-1 && initial_num + mul * between_Z + numRows - i - 1 + numRows - i - 1 < len){ index++; ret_str[index] = s[initial_num + mul * between_Z + numRows - i - 1 + numRows - i - 1]; index++; }else{ index++; } mul++; } } return ret_str; } }; */
用动态数组存储不同行的字符,每个周期内的元素 取模 只会落在竖列 或者 落在 斜列 ,分这两种情况进行讨论即可 ,具体的字符应该放在哪一个动态数组的序列中是可以用模 行数计算出来的。
class Solution { public: string convert(string s, int numRows) { int len = s.size(); string ret_str(s); if(numRows == 1){ return ret_str; } if(numRows == 2){ int i = 0; for(; i < (len+1)/2; i++){ ret_str[i] = s[i*2]; } for(int j = 0;i+j < len;j++){ ret_str[i+j] = s[j*2 + 1]; } return ret_str; } vector<string> ret_vec(numRows); int mod_distance = numRows + numRows - 2; for(int i = 0 ;i < len; i++){ /* if(i%mod_distance ==0){ ret_vec[0].append(s[i]); }else if(i%mod_distance == numRows-1){ ret_vec[numRows - 1].append(s[i]); }else if(i%mod_distance < numRows && i%mod_distance > 0){ ret_vec[i%mod_distance].append(s[i]); }else */ if(i%mod_distance < mod_distance && i%mod_distance >=numRows){ ret_vec[2*numRows - 2 - i%mod_distance] .push_back(s[i]); }else{ ret_vec[i%mod_distance].push_back(s[i]); } } string s2; for(auto it = ret_vec.begin();it != ret_vec.end();it++){ s2.append(*it); } return s2; } }; 标签:string,int,ret,numRows,C++,mod,leetcode,解法,vec From: https://www.cnblogs.com/daniel123/p/16756892.html