C语言详解Z字形变换排列的实现

 更新时间:2022年04月24日 11:43:21   作者:Fengliguantou@  
Z字形变换排列就是指将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列,下面让我们用C语言来实现

题目链接:Z 字形变换

方法一

——找规律模拟数组

题目要求构造一个从左到右的Z型矩阵。

通过分析,可以看出这个Z型矩阵的特点

Z型矩阵就是如图中的橙色,绿色这样部分组合在一起的,Z型矩阵就是由一个个这样相同周期组成的。

这里有一种情况需要特殊讨论,当矩阵只有一行时,直接返回原字符。

其余情况均可满足。

其周期的构成满足这样一个规律:

在第一列向下填写矩阵行数r个字符,接着向其右上部分共(r-2)列分别填写一个字符。Z型矩阵的周期t=r+r-2=2*r-2,每个周期会占用矩阵的r-1列,总共有 字符长度len/t个周期(将最后一个周期视作完整周期)。

因此创建一个具有r行c列的的二维矩阵,(这里在计算列的时候需要多+一个周期,因为除法的计算会舍去余数)。一开始从(0,0)这个位置开始填写字符,通过判断i%t与r-1的大小决定向上移动还是向下移动。

共两种情况:

i%t<r-1 :说明这时矩阵正在填写第一列的数字,这时只需要向下移动

i%t>=r-1:说明第一列已经填写好了,这时需要向右上方进行填写字符,所以需要向右移动一位,向上移动一位。

当一个周期运行完时,又会回到新周期的第一列。

再次遍历矩阵,将存储有字符的位置加入到一个新的字符串中。

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows==1||numRows>=s.size())//特殊情况进行排除
        return s;
      int r=numRows;//矩阵的行数
      int t=2*r-2;//周期所含字符个数
      int len=s.size();//字符串的长度
      int c=(len+t)/t*(r-1);//二维矩阵列数
      vector<string> v1 (r,string(c,0));
    for(int i=0, x=0,y=0;i<len;i++){
        v1[x][y]=s[i];
        
        if(i%t<r-1){
            x++;//向下移动
        }
        else{
            x--;//向上移动
            y++;//向右移动
        }  
    }
    string ans;
    for(int i=0;i<r;i++){//遍历矩阵,扫描字符并添加
        for(int j=0;j<c;j++){
            if(v1[i][j])
            ans+=v1[i][j];
        }
    }
    return ans;
    }
};

时间复杂度=o(nr)

空间复杂度=o(nr)

方法二

——压缩矩阵

在第一种方法,需要构造一个二维矩阵,但是其实只使用了其中的部分空间,这样就导致浪费了许多空间,因此可以对矩阵进行压缩。

依旧是将矩阵只有一行的情况进行额外讨论,若成立,直接返回原字符串。 反之,创建一个r行1列的的string数组,通过判断字符i的位置(与第一种方法的判断方式一样),直接将字符填写到数组的对应行。 举例说明:

这个Z型字符在模拟数组是这样呈现的:

class Solution {
public:
    string convert(string s, int numRows) {
    int len=s.size();//字符串长度
    int r=numRows;//矩阵行数
    int t=2*r-2;//周期所含字符个数
     if (r == 1) {
            return s;
        }
    vector<string> v1(r);
    int x=0;
        for(int i=0;i<len;i++){
            v1[x]+=s[i];
            if(i%t<r-1)
            x++;//向下移动
            else
            x--;//向上移动
        }
        string ans;
        for (auto &row : v1) {//遍历矩阵,扫描字符并添加
            ans += row;
        }
    return ans;
    }
};

时间复杂度:o(n)

空间复杂度:o(n)

到此这篇关于C语言详解Z字形变换排列的实现的文章就介绍到这了,更多相关C语言Z字形变换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 输入一行数字(含负数)存入数组中的案例

    C++ 输入一行数字(含负数)存入数组中的案例

    这篇文章主要介绍了C++ 输入一行数字(含负数)存入数组中的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 关于c语言的一个小bug详解

    关于c语言的一个小bug详解

    以下是对c语言中的一个小bug进行了详细的分析介绍。需要的朋友可以过来参考下
    2013-08-08
  • C++交换指针实例

    C++交换指针实例

    这篇文章主要介绍了C++交换指针实例,针对C与C++交换指针的方法进行了较为详细的对比分析,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • 基于Matlab实现有雪花飘落的圣诞树的绘制

    基于Matlab实现有雪花飘落的圣诞树的绘制

    圣诞节快到了(虽然还有十天),一起来用MATLAB画个简单圣诞树叭~代码几乎取消了全部的循环,因此至少需要17b之后的版本,仅存的循环用来让树旋转起来,让雪花飘落起来,让树顶上的星光摇曳起来~感兴趣的可以试一试
    2022-12-12
  • 在C语言编程中使用变量的基础教程

    在C语言编程中使用变量的基础教程

    这篇文章主要介绍了在C语言编程中使用变量的基础教程,特别需要注意C语言中的指针变量,需要的朋友可以参考下
    2016-02-02
  • 详解C++ Qt中堆叠窗体的使用案例

    详解C++ Qt中堆叠窗体的使用案例

    这篇文章主要为大家详细介绍了C++ Qt中堆叠窗体的使用案例,文中的示例代码讲解详细,对我们学习QT有一定的帮助,感兴趣的小伙伴可以了解一下
    2023-08-08
  • C语言WinSock学习笔记

    C语言WinSock学习笔记

    本篇文章主要介绍了C语言WinSock学习笔记,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2007-12-12
  • visual studio 建立dll类型工程、控制台程序

    visual studio 建立dll类型工程、控制台程序

    这篇文章主要介绍了visual studio 建立dll、控制台类型工程的相关知识,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • 利用C语言如何实现一些简单图形的打印

    利用C语言如何实现一些简单图形的打印

    这篇文章主要给大家介绍了关于利用C语言如何实现一些简单图形的打印的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C语言深入探索动态内存分配的使用

    C语言深入探索动态内存分配的使用

    给数组分配多大的空间?你是否和初学C时的我一样,有过这样的疑问。这一期就来聊一聊动态内存的分配,读完这篇文章,你可能对内存的分配有一个更好的理解
    2022-04-04

最新评论