将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:L   C   I   R
E T O E S I I G
E   D   H   N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);
示例 1:输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
示例 2:输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:L     D     R

开始没有思路,看完官方的思路和代码然后这样做的

char* convert(char* s, int numRows) {if (numRows == 1||numRows==0)return s;int n=strlen(s);if(n==0||n==1||n==2) return s;char *re = (char *)malloc((n + 1) * sizeof(char));int j, k = 0;for (int i = 0; i < numRows; i++) {j = i;while (j < n) {re[k++] = s[j];if (i != 0 && i != numRows - 1 && j + 2 * (numRows - 1 - i) < n)re[k++] = s[j + 2 * (numRows - 1 - i)];j += 2 * numRows - 2;}}re[n] = '\0';return re;
}

但是这样算法的复杂度有点高,大概是0(numRows+n)吧,后来看了下评论,发现一个比较优化的解法

,也是逐行处理,但是算法的复杂度貌似缩小到了0(n),大概思路是先遍历0行,然后是i行,然后是剩下的

代码如下:

char* convert(char* s, int numRows) {//获取s长度if(numRows==1)return s;int len=strlen(s); if(len==1||len==2) return s;//定义循环变量char* ret=(char *)malloc(sizeof(char)*(len+1));int i,j=0,k=0;//判断不形成z字//定义指针变量for(i=0;i<len;i=k*(2*numRows-2)){ret[j++]=s[i];k++;}//判断满足那个条件for(i=1;i<len-1;i++){k=0;while(k*(2*numRows-2)+i<len){//按照索引添加ret[j++]=s[k*(numRows-2)+i];if((k+1)*(2*numRows-2)-i<len) ret[j++]=s[(k+1)*(2*numRows-2)-i];k++;}}k=0;for(i=numRows-1;i<len;i=k*(2*numRows-2)+numRows-1){ret[j++]=s[i];k++;}ret[j]='\0';return ret;
}

转载于:https://www.cnblogs.com/kk328/p/10468261.html

leetcode刷题六z字形变换相关推荐

  1. leetcode刷题:z字形变换

    题目: 图解思路 实现代码如下: class Solution { public:string convert(string s, int numRows) {if(numRows < 2) r ...

  2. LeetCode刷题笔记第6题:Z字形变换

    LeetCode刷题笔记第6题:Z字形变换 想法: 要完成字符串根据给定的行数从上往下,从左到右完成Z字形排列.当只有一行时直接返回原字符串,当行数大于1时,先以行数构建一个行数数值个空字符串的列表, ...

  3. Java算法题:Z字形变换

    Java算法题:Z字形变换 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行 ...

  4. LeedCode刷题笔记-Z字形变化

    LeedCode刷题笔记-Z字形变化 题目描述 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRI ...

  5. leecode算法题之Z字形变换

    题目描述: 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排 ...

  6. 力扣(LeetCode)刷题,简单+中等题(第33期)

    目录 第1题:Z 字形变换 第2题:删除字符串中的所有相邻重复项 第3题:基本计算器 II 第4题:螺旋矩阵 第5题:螺旋矩阵 II 第6题:盛最多水的容器 第7题:删除有序数组中的重复项 II 第8 ...

  7. leetcode第六题Z字形变换心得记录

    算法学习之路-坚持走下去 Z字形变换 题目描述 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行 ...

  8. java编写字母z算法_【Java】【每日算法/刷穿 LeetCode】6. Z 字形变换(中等)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]6. Z 字形变换(中等) 宫水三叶发布于 今天 12:03 题目描述 将一个给定字符串 s 根据给定的行数 numRows , ...

  9. Z 字形变换 C++实现 java实现 leetcode系列(六)

    Z 字形变换  java实现 C++实现  将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 ...

最新文章

  1. 大道至简_阅读笔记02
  2. 005_Button按钮
  3. hive 简单操作搜狗实验室的词频文件
  4. 这场戏里,到底是谁脏了?
  5. 《MySQL——如何解决一主多从的读写分离的过期读问题》
  6. PHP学习——定界符格式引起的错误
  7. c语言数组如何把一串数字存入数组_C语言经典编程题(下)
  8. 假如有人炸了支付宝的存储服务器...
  9. 校招应聘产品经理,怎么准备?网易大佬来回答
  10. 拯救者linux无法正常关机,菜鸟求助。centos无法关机。请各位高手帮忙! - Linux论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  11. python2.7环境变量的配置_Windows7下python2.7.6环境变量配置
  12. 2.4~5 x86计算机的组成
  13. linux中Chmod + X
  14. 配置MatConvNet
  15. 我的求学十年(00至10):从中学到大学,年少轻狂立大志
  16. Qt5.12.9 搜狗输入法不能使用,配置解决方案
  17. ROS智能车定位导航仿真(已实现)
  18. 如何在oracle官网下载ojdbc8,想不想在maven里直接下载ojdbc这个jar?
  19. python爬微信公众号视频_python爬虫公众号所有信息,并批量下载公众号视频
  20. css3扭蛋机,微信小程序扭蛋抽奖机css3动画实现详解.pdf

热门文章

  1. 计算机视觉哪个方向最火?来看这篇综述《中国图像工程:2020》
  2. C++/C--浮点型数据的二进制表示及其内存存储形式
  3. ubuntu 16.04下切换python版本小结
  4. Zdenek Kalal的TLD Tracker(牛啊,学习!)
  5. 相机标定(Camera calibration)
  6. 波兰表达式(前序表达式)的计算(栈)
  7. Struts2访问Servlet的三种方式
  8. Struts标签入门
  9. 【编撰】linux IPC 002 - 匿名管道PIPE和有名管道FIFO的概念和实例,以及应用比较
  10. 主机甲采用停等协议向主机乙_习题