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

数学构造

Z Z Z 字形变换类似情报加密。找规律解密,就能得到构造的方法。
力扣(LeetCode)6. Z 字形变换(C++)_第1张图片
0 0 0 行相邻的数,取 n = 4 n=4 n=4 如上图,观察第 0 0 0 行和第 3 3 3
相邻的数,组成等差数列,公差 d = 6 = 2 n − 2 d=6=2n-2 d=6=2n2
2 n − 2 2n-2 2n2 是说 , 第 1 1 1 列有 n n n 个数 , 第 1 1 1 列到下一次变换的开头之间有 n − 2 n-2 n2 个数 , 总共 2 n − 2 2n-2 2n2 个数。

对于第 1 1 1 行或者第 2 2 2 d = 2 n − 2 d=2n-2 d=2n2 , 但是每行有两个等差数列,两个等差数列首项的关系是 n u m 2 = d − n u m 1 num2 = d - num1 num2=dnum1

对于一般的 n n n Z Z Z 字形变换,有
a n s ans ans 保存答案 , 对于第 i i i 行,其中 i = 0   ∣ ∣   i = n − 1 i =0~||~ i=n-1 i=0  i=n1

	for(int j = i;j<s.size();j+=d)
		ans += s[j];

对于 i > 0    & &    i < n − 1 i>0~~\&\& ~~ii>0  &&  i<n1

	for(int j = i,k = d - j;j<s.size();j+=d,k+=d){
        ans+=s[j];
        if(k<s.size()) ans+=s[k];
    }
代码展示
class Solution {
public:
    string convert(string s, int n) {
        if(1==n) return s;
        string ans;
        int d = 2*n-2;//公差
        for(int i = 0;i<n;i++){
            if(0==i||n-1==i){
                for(int j = i;j<s.size();j+=d)
                    ans += s[j];
            }else{
                for(int j = i,k = d - j;j<s.size();j+=d,k+=d){
                    ans+=s[j];
                    if(k<s.size()) ans+=s[k];
                }
            }
        }
        return ans;
    }
};
博主致语

理解思路很重要!
欢迎读者在评论区留言,作为日更博主,看到就会回复的。

AC

力扣(LeetCode)6. Z 字形变换(C++)_第2张图片

复杂度分析
  1. 时间复杂度: O ( m ) O(m) O(m) m m m s s s 的长度 。 构造 Z Z Z 字形的过程只遍历每个字符一次,时间复杂度 O ( m ) O(m) O(m)
  2. 空间复杂度: O ( 1 ) O(1) O(1),除答案占用的空间,没有使用额外的线性空间 。

你可能感兴趣的:(墨染leetcode,leetcode,c++,算法,模拟,构造)