返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言详解Z字形变换排列的实现
  • 645
分享到

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

2024-04-02 19:04:59 645人浏览 八月长安
摘要

目录方法一方法二题目链接:Z 字形变换 方法一 ——找规律模拟数组 题目要求构造一个从左到右的Z型矩阵。 通过分析,可以看出这个Z型矩阵的特点 Z型矩阵就

题目链接: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字形变换内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言详解Z字形变换排列的实现

本文链接: https://lsjlt.com/news/147139.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言详解Z字形变换排列的实现
    目录方法一方法二题目链接:Z 字形变换 方法一 ——找规律模拟数组 题目要求构造一个从左到右的Z型矩阵。 通过分析,可以看出这个Z型矩阵的特点 Z型矩阵就...
    99+
    2024-04-02
  • C语言怎么实现Z字形变换排列
    本篇内容介绍了“C语言怎么实现Z字形变换排列”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!题目链接:Z 字形变换方法一&mdash;...
    99+
    2023-06-30
  • C++中的Z字形变换问题
    目录Z字形变换描述Z字形变换 描述 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALIS...
    99+
    2024-04-02
  • C++中的Z字形变换问题怎么解决
    这篇“C++中的Z字形变换问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++中的Z字形变换问题怎么解决”文章吧...
    99+
    2023-07-02
  • C语言实现字符串字符反向排列的方法详解
    目录前言非递归方法1.循环实现2.函数实现递归方法1.递归方法2.递归方法小结前言 重点的话说在前头,注意不是逆序打印 今天写题,碰到一个很好的题,在这里来个大家做个分享,我会用多种...
    99+
    2024-04-02
  • C语言详解实现字符菱形的方法
    目录前言1.定义stdio.h头文件2.定义主函数3.定义行数-单数4.得出分割行数5.定义字符6.初始化打印字符数与打印空白数7.循环打印菱形8.打印上部分9.打印剩下部分10.完...
    99+
    2024-04-02
  • C语言详解冒泡排序实现
    目录前言一、冒泡排序是什么二、具体步骤1.代码解释2.读入数据总结前言 在排序中,有各种各样的排序方式,今天我们将要来介绍《冒泡排序》。今天会从冒泡排序的具体意义和他的操作来展开。 ...
    99+
    2024-04-02
  • C语言实现队列的示例详解
    目录前言一. 什么是队列二. 使用什么来实现栈三. 队列的实现3.1头文件3.2 函数的实现四.完整代码前言 前一段时间,我们试着用C语言实现了数据结构中的顺序表,单链表,双向循环链...
    99+
    2024-04-02
  • C语言实现井字棋详解
    目录1.主函数2.menu菜单3.test函数4.game函数(1)4.1数据存储的二维数组:InitBoard4.2棋盘的打印:DisplayBoard4.3玩家下棋:Player...
    99+
    2024-04-02
  • C语言怎么实现radon变换
    C语言实现Radon变换的步骤如下: 首先,你需要定义一个输入图像的二维数组,并初始化图像的像素值。 创建一个与输入图像等大...
    99+
    2023-10-23
    C语言
  • C语言详解用char实现大小写字母的转换
    目录一、例题二、例题三、总结一、例题 将多个字母进行小写转换成大写 代码: #include <stdio.h> int main (void) { char a,b,...
    99+
    2024-04-02
  • C语言可变长的参数列表详解
    C语言可变长的参数列表 C语言可创建接收参数个数不确定的函数。如常用的标准库函数printf就是一个接收参数个数可变的函数。函数printf至少要接收一个字符串作为它的第一个实参。但...
    99+
    2024-04-02
  • C语言递归实现归并排序详解
    归并排序递归实现还是比较难理解的,感觉涉及递归一般理解起来都会比较有难度吧,但是看了b站视频,然后照着打下来,然后自己写了点注释,就发现不知不觉都大概懂了。 这里的归并讲的是升序排序...
    99+
    2024-04-02
  • C语言中递归和排列组合详解
    目录排列组合三大问题:1.打印n个数的全排列2.打印n个数中任意m个数的全排列3.打印n个数中任意m个数的组合完整代码如下:总结排列组合三大问题: 1.打印n个数的全排列2.打印n个...
    99+
    2024-04-02
  • c语言回溯全排列怎么实现
    可以使用递归的方式实现回溯法求全排列。具体步骤如下:1. 定义一个递归函数 `backtrack()`,该函数有两个参数:`nums...
    99+
    2023-09-08
    c语言
  • c语言全排列算法怎么实现
    以下是一个用C语言实现全排列的算法示例: #include <stdio.h> #include <string....
    99+
    2024-04-02
  • C语言--数字交换题目详解
    目录一、题目分析二、算法分析和设计心路历程位置分析分析交换算法回顾总结(问题核心)三、编写代码四、出现问题总结一、题目分析 大致题意就是通过交换把最小的数放到最前面,最大的数放最后...
    99+
    2024-04-02
  • C语言字符串替换空格实例详解
    目录一、题目描述二、思路分析三、整体代码总结一、题目描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例: 输入:s = "We a...
    99+
    2024-04-02
  • C语言的可变参数函数实现详解
    目录1、简介2、简单的使用方式总结1、简介 今天看到一个有趣的东西C语言的可变参数函数 众所周知,C语言的函数不能重载,那么你printf和scanf是怎么可以输入多个参数的 例如查...
    99+
    2024-04-02
  • C语言进程程序替换的实现详解
    目录进程程序替换替换原理替换函数替换函数名称助记进程程序替换 替换原理 使用fork创建子进程后执行的是和父进程相同的程序,但是那样并没有多大的意义,子进程往往会“程序替...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作