N字型变换

题目:

将一个给定字符串 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);

示例 1:

复制代码
输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"

示例 2:

复制代码
输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P     I    N
A   L S  I G
Y A   H R
P     I

示例 3:

复制代码
输入:s = "A", numRows = 1
输出:"A"

思路:
二维矩阵模拟:

这个题主要的突破口就是对题目的理解,题目的大致意思即把一个长字符串摆成从上到下,从左到右的N字形,然后在从左到右,从上到下的重新组合成为一个新的字符串。摆成一个矩阵,必然少不了要用到二维数组,用到二维数组,我们在不清楚字符串长度的情况下,首先想到的是把二维数组大小进行动态内存分配,然后,涉及到动态内存分配,我们最重要的一点就是要得到字符串长度与构造的二维数组的行列关系,其次再往二维数组中位置一个一个去把长字符串一一对应的填进去,最后就是按照顺序把他们读取出来。

这里稍微需要注意的就是字符串长度与二维数组行列之间的关系,题目中会给出numrows,也就是给出行数,我们这里用r代替。假设我们从第一列往下摆字符,首先先向下摆r个字符,然后向右上方摆放r-2个字符,这样我们可以看作一个周期,所以一个周期t的字符数为2*r-2,同时我们一样确定了一个周期的列数为r-1,所以我们就可以得到整个列数为(n+t-1)/2*r-2 * r-1.至于为什么要加上一个周期减一,其实道理很简单,我们在除法运算中如果没有整除,会自动舍弃后面的余数,避免字符串内被舍弃字符,我们就把二维数组做大一点,但不至于大一个周期出来,这样既可以考虑到原本字符串不整除的情况,为其补全那一个周期,也可以避免多出一个空白周期出来。

代码实现:

复制代码
char * convert(char * s, int numRows){
    int n=strlen(s), r=numRows;
    if(r==1||n<=r){
        return s;
    }
    int t=r*2-2;
    int c=(n+t-1)/t*(r-1);
//二维数组初始化
    char **mat=(char **)malloc(sizeof(char *)*r);
    for(int i=0;i<r;i++){
        mat[i]=(char *)malloc(sizeof(char)* c);
        memset(mat[i], 0, sizeof(char)* c);
    }
//二维数组填充
    for(int i=0, x=0, y=0; i<n; i++){
        mat[x][y]=s[i];
        if(i%t<r-1){
            x++;
        }else{
            x--;
            y++;
        }
    }
//取出字符
    int pos=0;
    for(int i=0; i<r;i++){
        for(int j=0;j<c;j++){
            if(mat[i][j]){
                s[pos++]=mat[i][j];
            }
        }
        free(mat[i]);
    }
    free(mat);
    return s;
}
相关推荐
apcipot_rain3 分钟前
CSP集训错题集 第八周 主题:基础图论
算法·图论
天选之女wow3 分钟前
【代码随想录算法训练营——Day57(Day56周日休息)】图论——53.寻宝
算法·图论
文火冰糖的硅基工坊15 分钟前
[人工智能-大模型-103]:模型层 - M个神经元组成的单层神经网络的本质
python·算法·机器学习
无语子yyds42 分钟前
C++双指针算法例题
数据结构·c++·算法
Skrrapper1 小时前
【STL】set、multiset、unordered_set、unordered_multiset 的区别
c++·算法·哈希算法
SunnyKriSmile1 小时前
函数递归求最大值
c语言·算法·函数递归
傻啦嘿哟1 小时前
爬虫数据去重:BloomFilter算法实现指南
爬虫·算法
立志成为大牛的小牛1 小时前
数据结构——三十六、拓扑排序(王道408)
数据结构·学习·程序人生·考研·算法
懒羊羊不懒@1 小时前
JavaSe—List集合系列
java·开发语言·数据结构·人工智能·windows
绛洞花主敏明3 小时前
Go切片的赋值
c++·算法·golang