leetcode做题笔记6

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

第一种思路:

找出规律进行求解,利用z字形字符之间隔的字符个数有规律求解,验证得此方法可行

char * convert(char * s, int numRows)
{
    if(strlen(s)<=numRows||numRows==1)return s;
    char *arr = (char*)malloc(sizeof(char)*(strlen(s)+1));
    int t = numRows*2 - 2;
    int a = 0;
    for(int i = 0;i0&&i< numRows -1&&k + t - i

时间复杂度为O(n^2);空间复杂度为O(n);

本题一开始想找N字形的数学规律,发现排列的数中一竖列加上斜向右上的数可为一个周期,即一个竖钩,这个竖钩的数的个数为排的列乘2再减二,于是便想到一个周期一个周期的存放数到另一数组中,之后再输出即可,实践的过程中发现每个数都对应了周期的规律,直接将k加上周期数再存放到新数组中即可。在使用for循环的时候思索了很久,最后想到利用列的个数有限来设置限制条件,最后验证得此方法可行。

问题:实践的过程中在for循环的考虑上花了很久时间,对问题的本质没有理清

收获:对N字形问题有了较深的体会,理解了周期输出的本质,对循环的掌握更深了

你可能感兴趣的:(leetcode,笔记,算法)