电商网站运营方案,郑州妇科医院排行,免费logo设计生成器在线制作,阿里云登录入口文章目录 题目链接#xff1a;题目描述#xff1a;解法C 算法代码#xff1a; 题目链接#xff1a;
6. N 字形变换 题目描述#xff1a; 解法 解法一#xff1a;模拟 a,b,c,d,e,f,g...... n4 弄个矩阵放进去#xff0c;最后从左往右读取。 解法二#xff1a;模拟优化-… 文章目录 题目链接题目描述解法C 算法代码 题目链接
6. N 字形变换 题目描述 解法 解法一模拟 a,b,c,d,e,f,g...... n4 弄个矩阵放进去最后从左往右读取。 解法二模拟优化-找规律 在n4的时候0和6之间相差了6个元素012345 我们把元素移动位置可以得到在输出的第一个元素后面那个元素是距离第一个元素2n-2个元素的。得到公差d2n-2
第0行的规律就是0-0d-02d......-0kd (kdlen)
第n-1行的规律就是n-1-n-1d-n-12d......-n-1kd (n-1kdlen) 这里的第1~n-2行都有两个元素是一组的。并且他们加起来刚好是公差。
第1~n-2行的规律是(k,d-k)-(kd,2d-k)......-(k(k-1)d,kd-k) (k(k-1)dlen),(kd-klen)
不过如果就这么结束那就错啦。
n1的时候运用上面的规律就会死循环所以我们要单独讨论n1的情况直接输出字符串。 C 算法代码
class Solution
{public:string convert(string s, int numRows){// 处理边界情况if(numRows 1) return s;string ret;int d 2 * numRows - 2, n s.size();// 1. 先处理第一行for(int i 0; i n; i d)ret s[i];// 2. 处理中间行for(int k 1; k numRows - 1; k) // 枚举每一行{for(int i k, j d - k; i n || j n; i d, j d){if(i n) ret s[i];if(j n) ret s[j];}}// 3. 处理最后一行for(int i numRows - 1; i n; i d)ret s[i];return ret;}
};