文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言怎么实现Z字形变换排列

2023-06-30 10:14

关注

本篇内容介绍了“C语言怎么实现Z字形变换排列”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

题目链接:Z 字形变换

C语言怎么实现Z字形变换排列

方法一

——找规律模拟数组

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

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

C语言怎么实现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)

方法二

&mdash;&mdash;压缩矩阵

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

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

C语言怎么实现Z字形变换排列

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

C语言怎么实现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字形变换排列”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯