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;
    }
};
posted @ 2022-10-06 00:45  danieldai  阅读(21)  评论(0编辑  收藏  举报