leetcode 6 Z字形变化 C/C++ 找规律解法 / 用容器的解法
找规律 , 除了一行 和 两行需要特殊处理之外,其他的规律是一样的。
/*
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;
}
};