模拟-6.N字形变换-力扣(LeetCode)
一、题目解析
1、将字符串s从上到下 ,从左往右Z字形排列
2、固定行数,按行数从左往右,从上往下得到新字符串
二、算法原理
解法1:模拟
模拟顾名思义,模拟题目的运行过程
解法2:找规律
在模拟的基础上,我们可以通过找规律优化时间复杂度和空间复杂度
根据总结的规律我们可以将其分为三个循环解决,第一个循环解决第0行,双重循环解决中间行,最后一个循环解决第numRows-1, 以及需要注意细节问题,即中间行排列过后不一定成对出现,所以在第二层循环处对于判断要用||,而且还需要判断是否越界
三、代码示例
解法2:
class Solution {
public:string convert(string s, int numRows){if(numRows == 1) return s;int d = 2*numRows-2;string ret;for(int i = 0;i<s.size();i+=d) ret += s[i];//第1行for(int i = 1;i<numRows-1;i++)//中间行{for(int j = i,k = d-i;j<s.size() || k<s.size();j+=d,k+=d){if(j<s.size()) ret += s[j];if(k<s.size()) ret += s[k];}}for(int i = numRows-1;i<s.size();i+=d) ret += s[i];//最后一行return ret;}
};