6. Z 字形变换 - 力扣(LeetCode)

两个点:将原字符串转化为z形,考虑位置?开数组记录位置?;排列好之后,如何按行读出字符串

实际不用考虑形式上的转换,找规律:按照等差数列的形式,直接列出答案

(这种奇怪题,先考虑找规律)

class Solution {
public:
    string convert(string s, int n) {//numRows为n
        string res;
        if(n==1) return s;// 如果只有一行,则直接返回原字符串
        for(int i = 0; i<n; i++){//从第一行开始,到最后一行
            if(i==0 || i==n-1){//第一行或第n行,首项为i的等差数列
                for(int j = i; j<s.size(); j += 2*n-2)
                    res += s[j];//完善结果:字符串可直接添加
            }else{//中间行:可划分为两个数列
                for(int j = i, k=2*n-2-i; j<s.size()||k<s.size(); j+=2*n-2, k+=2*n-2){
                    if(j < s.size()) res += s[j];// 添加第一个字符
                    if(k < s.size()) res += s[k];// 添加第二个字符
                }
            }
        }
        return res;//转换后的字符串
    }
};