南京网络建站模板,网站开发方法,手机建网站软件,wordpress nginx配置伪静态个人主页#xff1a;Lei宝啊
愿所有美好如期而遇 题目链接
. - 力扣#xff08;LeetCode#xff09;
输入描述
string convert(string s, int numRows)#xff0c;输入一个字符串s#xff0c;以及一个行数numRows#xff0c;将字符串按照这个行数进行Z字形排列Lei宝啊
愿所有美好如期而遇 题目链接
. - 力扣LeetCode
输入描述
string convert(string s, int numRows)输入一个字符串s以及一个行数numRows将字符串按照这个行数进行Z字形排列实际上本题是将Z字形反转成了N字形。
输出描述
按照行将Z字形排列的字符打印出来。
算法分析
模拟算法实际上就是根据题目要求做优化就是找规律。
本道题我们将通过画图来找规律以示例二为例画图 找规律这没有什么比较好的方法找得到就是找得到根据图我们可以发现第一行和最后一行每个元素的下标差了6也就是说公差为6而中间行的元素虽然也遵循这个规律不过是两个数字两个数字这样来进行的--167 5611。
那么如何计算公差你说公差是6就是了吗我们可以多画几个图来进行验证最后我们可以得到的结论是公差d 2 * 行数 - 2
对于第一行和最后一行而言我们可以直接使用公差进行计算而对于中间行来说需要两个数字一起向后走那么我们怎样得到第二个数字呢观察后我们可以发现这两个数字的下标加起来正好是公差d所以我们可以用公差 - 下标一 下标二后面的下标我们通过公差就可以得到了。
我们也就可以按照这样的规律让下标和字母进行对应直接把字符尾插进我们创建的string s变量中。
解题源码
class Solution {
public:string convert(string s, int numRows) {if(numRows 1) return s;string ret;int d 2 * numRows - 2;int len s.size();for(int i0; ilen; id) ret s[i];for(int i1; inumRows-1; i){for(int ji, kd-i; jlen || klen; jd, kd) {if(jlen) ret s[j];if(klen) ret s[k]; } }for(int inumRows-1; ilen; id) ret s[i];return ret;}
};