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- ...
随机推荐
- vue根据ajax绑定数数。。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 背包九讲PDF
本资料仅限个人学习交流使用,不得用于商业用途. 背包九讲PDF:https://pan.baidu.com/s/17rTxMwCo9iSTOW77yucdXQ 提取码:xbqa
- DevExpress winform 友好皮肤
DevExpress设置默认皮肤及各种皮肤样式 DevExpress设置默认皮肤及各种皮肤样式 设置默认皮肤代码: 在程序入口Program.cs里添加如下代码 引用using DevExpres ...
- Vue插槽的深入理解和应用
一开始接触vue时并不知道插槽是什么,后来看了很多文章也是一知半解.然后自己手动敲了一下,在项目中实际应用一下,实在太好用了.后来做小程序后发现也能使用slot,不单单在vue中使用.我就是这么目光短 ...
- centos6.5 配置静态IP
1.修改网卡配置 编辑:vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=static HWADDR=08:00:2 ...
- LOJ #6539 奇妙数论题
不想咕太久..就随便找个题更一下 LOJ#6539 题意 求题面里那个式子 题解 有一个常用的小式子 $$\sum_{x|a,x|b}\varphi(x)=\gcd(a,b)$$ 用这个式子直接对题面 ...
- L1-Day13
1.Being late is an unforgivable sin here.[我的翻译]在北京,迟到是不可饶恕的罪名.[标准答案]在这里迟到是不可原谅的.[对比分析]对自己的也是醉醉的了,Bei ...
- [系统集成] 基于telegraf, influxdb, grafana 建立 esxi 监控
之前在 nagios 上建立了 esxi 监控,指标少.配置麻烦.视觉效果差.最近我把 esxi 监控迁移到了 influxdb+grafana 平台上,无论是监控指标.可操作性还是视觉效果都有了很大 ...
- Docker-----仓库
安装registry 安装并启动docker yum -y install docker systemctl enable docker systemctl start docker 下载regist ...
- jmeter和jdk的安装教程
jmeter和jdk的安装教程 1:先下载安装jdk并且配置环境变量,配置环境变量的步骤如下: 右击计算机图标--点击属性--点击高级系统设置--点击环境变量后添加jdk的环境变量 a.系统变量→新建 ...