将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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;
}

leetcode刷题六<z字形变换>的更多相关文章

  1. Leetcode(6)Z字形变换

    Leetcode(6)Z字形变换 [题目表述]: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" ...

  2. leetcode第6题:Z字形变换--直接模拟求解法

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

  3. 【LeetCode】ZigZag Conversion(Z 字形变换)

    这道题是LeetCode里的第6道题. 题目要求: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" ...

  4. Leetcode题库——6.Z字形变换

    @author: ZZQ @software: PyCharm @file: convert.py @time: 2018/9/20 20:12 要求: Z字形变换 将字符串 "PAYPAL ...

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

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

  6. C#版[击败100.00%的提交] - Leetcode 6. Z字形变换 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  7. Java实现 LeetCode 6 Z字形变换

    6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...

  8. LeetCode Golang 6. Z 字形变换

    6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...

  9. Leetcode刷题记录(python3)

    Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...

随机推荐

  1. [Reinforcement Learning] Value Function Approximation

    为什么需要值函数近似? 之前我们提到过各种计算值函数的方法,比如对于 MDP 已知的问题可以使用 Bellman 期望方程求得值函数:对于 MDP 未知的情况,可以通过 MC 以及 TD 方法来获得值 ...

  2. 线程——自定义多线程task

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. IDEA中 GIT与SVN版本控制插件的切换

    https://www.cnblogs.com/yccmelody/p/7794220.html

  4. mysql GTID

    之前一直通过binlog主从同步,现在发现GTID这种方式,记录一下,具体可参考网上教程.感觉配置使用更为简单方便,不知实际效果如何.

  5. 简单易懂的解释c#的abstract和virtual的用法和区别

    先来看abstract方法,顾名思义,abstract方法就是抽象方法. 1.抽象方法就是没有实现的,必须是形如: public abstract void Init(); 2.拥有抽象方法的类必须修 ...

  6. Spring Cloud配置中心搭建(集成Git)

    1. 在Github(或其他)创建配置中心仓库bounter-config-repo,然后在仓库创建两个配置文件:simon.properties.susan.properties,链接如下: htt ...

  7. 四, 判断语句; 循环; 使用dict和set

    1)  练习 小明身高1.75,体重80.5kg.请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数: 低于18.5:过轻 18.5-25:正常 25-28:过重 28- ...

  8. django-auth组件

    auth组件 一.auth模块简介 auth模块是django自带的用户认证模块,包含了身份验证和权限管理两部分. 身份验证用于核实某个用户是否合法,权限管理用于决定一个合法用户有哪些权限 默认情况下 ...

  9. Go命令官方指南【原译】

    启动错误报告 编译包和依赖项 删除目标文件和缓存的文件 显示包或符号的文档 打印Go环境信息 更新包以使用新API Gofmt(重新格式化)包源 通过处理源生成Go文件 下载并安装包和依赖项 编译并安 ...

  10. ASP.NET Core 中使用Session会话

    添加Session Nuget包 更新Startup.cs文件 在ConfigureServices方法中添加如下代码 services.AddSession(options => { // S ...