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;
}
相关推荐
科研小白_d.s3 分钟前
冒泡排序原理及python代码
数据结构·python·算法
可别是个可爱鬼4 分钟前
代码随想录 -- 回溯 -- 子集
数据结构·算法·leetcode
水木流年追梦1 小时前
【shell脚本5】Shell脚本学习--条件控制
人工智能·python·深度学习·学习·算法·机器学习
且行且知1 小时前
`#include <vector>`
c++·算法
铁链鞭策大师2 小时前
java之斗地主部分功能的实现
java·数据结构
saberyydsicloud2 小时前
C++(9.24)
开发语言·c++·算法
重生之我是数学王子2 小时前
Leetcode 1039. 多边形三角形剖分的最低得分 枚举型区间dp C++实现
c++·算法·leetcode·深度优先·动态规划
Ciderw2 小时前
leetcode155.最小栈,两个栈
数据结构·c++·算法·leetcode·面试·职场和发展
大二转专业2 小时前
408算法题leetcode--第11天
考研·算法·leetcode
Ciderw2 小时前
LeetCode 257. 二叉树的所有路径,dfs
数据结构·c++·算法·leetcode·面试·深度优先