leetcode刷题六<z字形变换>
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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字形变换>的更多相关文章
- Leetcode(6)Z字形变换
Leetcode(6)Z字形变换 [题目表述]: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" ...
- leetcode第6题:Z字形变换--直接模拟求解法
[题目描述] 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: 之后,你 ...
- 【LeetCode】ZigZag Conversion(Z 字形变换)
这道题是LeetCode里的第6道题. 题目要求: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" ...
- Leetcode题库——6.Z字形变换
@author: ZZQ @software: PyCharm @file: convert.py @time: 2018/9/20 20:12 要求: Z字形变换 将字符串 "PAYPAL ...
- Z 字形变换 C++实现 java实现 leetcode系列(六)
Z 字形变换 java实现 C++实现 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 ...
- C#版[击败100.00%的提交] - Leetcode 6. Z字形变换 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- Java实现 LeetCode 6 Z字形变换
6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...
- LeetCode Golang 6. Z 字形变换
6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...
- Leetcode刷题记录(python3)
Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...
随机推荐
- 08--STL关联容器(set/multiset)
一:set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. set采用红黑树变体的数据结构实 ...
- 对半导体制造(FAB)工种的全方位解析
本文转载自微信公众号 - 感集网, 链接 https://mp.weixin.qq.com/s/MRoWRbKZFBrJcQAZPqDa7w
- Turtle库的学习积累
1.什么是turtle库 Python的Turtle库是一个直观有趣的图形绘制函数库,Turtle英文翻译过来是乌龟的意思,在绘图时可以想象成一只乌龟在移动. 2.绘图坐标体系 海龟的移动方向 3.绘 ...
- Ubuntu16.04安装NVIDA驱动和CUDA
该GPU是计算卡,不会用做显示,所以如果你希望自己的显示使用GPU,本方法可能失效. 服务器配置: CPU: E5-母鸡 GPU: NVIDIA Tesla K40c 操作系统:Ubuntu 16. ...
- github 远程库
一.在 Github 创建 django 项目时:先在本地创建项目,然后设置为本地仓库,再与远程仓库关联 在 Git Bash 进入django项目目录,输入命令git init,此时这个目录变成Gi ...
- word20170101厨房家电kitchen appliances
1. Microwave Ovens 2. Electric Kettles 3. Coffeemakers 4. Espresso Machines 5. Toasters 6. Sandwich ...
- Anniversary party POJ - 2342 (树形DP)
题目链接: POJ - 2342 题目大意:给你n个人,然后每个人的重要性,以及两个人之间的附属关系,当上属选择的时候,他的下属不能选择,只要是两个人不互相冲突即可.然后问你以最高领导为起始点的关系 ...
- Appnium-API-Dvice
Device Activity Start Activity Start an Android activity by providing package name and activity name ...
- C#实现在foreach中删除集合中的元素
List<string> str = new List<string>(); str.Add( "zs"); str.Add("ls") ...
- 基于Spring Security OAuth2搭建的Spring Cloud 认证中心
Github传送门:https://github.com/13babybear/bounter-springcloud 实现功能有: 整合JWT 刷新Token 自定义客户端储存 自定义用户储存 资源 ...