LeetCode——6. ZigZag Conversion
一.题目链接:https://leetcode.com/problems/zigzag-conversion/description/
二.题目大意:
给定一个字符串和一个数字,将其转换成Zigzag形式后,逐行输出该字符串。所谓的Zigzag形式,具体如下:
/*n=numRows
Δ=2n-2 1 2n-1 4n-3
Δ= 2 2n-2 2n 4n-4 4n-2
Δ= 3 2n-3 2n+1 4n-5 .
Δ= . . . . .
Δ= . n+2 . 3n .
Δ= n-1 n+1 3n-3 3n-1 5n-5
Δ=2n-2 n 3n-2 5n-4
*/
也就是把一个字符串拆成"N"字形。
三.题解:
这道题目的主要难点在于不知道Zigzag的具体形式,在了解了Zigzag的具体形式后,实际上就是一道关于字符串找规律的题目,对于有的列,它每行都有字符;而对于另一些列,它只有某一行有字符,弄清规律后,就直接撸代码。
方法1:直接用一个二维数组存储字符串的Zigzag形式,然后在逐行输入,代码如下:
class Solution
{
public:
int index = ;//表示字符串的位置
int len = ;
int _cl = ;//记录总列数
string convert(string s, int numRows)
{
len = s.size();
char str[][];
memset(str,'#',sizeof(str));
string rs = "";
int flag = ;//用于判断是做单列处理还是做多列处理
if(numRows == )
return s;
while(index != len)
{ if(flag & )
{
int temp = manyColumn(str,numRows,s); if( temp == )
{
flag++;
continue; }
}
else
{ int temp = oneColumn(str,numRows,s);
if( temp == numRows)
{
flag++;
_cl++; }
else
{
if(index >= len)
_cl++;
}
}
}
for(int i = ; i < numRows; i++)
{ for(int j = ; j < _cl; j++)
{
if(str[i][j] != '#')
rs += str[i][j]; } } return rs;
}
int oneColumn(char str[][],int numRows,string s)
{
for(int i = ;; i++)
{
if(index != len && i != numRows)
{
str[i][_cl] = s[index++]; } else
return i;
} }
int manyColumn(char str[][],int numRows,string s)
{ for(int i = numRows - ; ; i--)
{
if(index != len && i != )
{ str[i][_cl++] = s[index++]; }
else
{ return i;
} } }
};
这种实现方法,我把二维数组初始化成值包含"#"的字符数组,然后对于这两种列进行分情况讨论,实现起来感觉很麻烦(涉及的变量多,细节点多),时间复杂度为O(n*numRows),实际提交结果为106ms,基本上是最慢的那一类方法了。
方法2:根据方法1,做出了些改进(当然只是实现上的改进,对于算法,由于是找规律的题目,找到规律,相当于就是算法了,所以这类题目一般算法上没什么改进)。对于一个二维数组,没插入任何字符的位置,我么那就不去考虑它了,直接考虑插入字符的位置,即对于每一行,如果某列没有插入元素的话,就不去考虑这一行了,直接考虑下一行,直到所有的元素都插入完成。带代码如下:
class Solution
{
public:
string convert(string s, int numRows)
{
int len = s.size();
int row = 0;
int flag = 0;
string rs ="";
if(numRows == 1)
return s;
string *temp = new string[numRows];//定义每一行对应的string
for(int i = 0; i < len; i++)
{
if(row == 0)
flag = 1;
if(row == numRows - 1)
flag = -1;
temp[row].push_back(s[i]);
row += flag; }
for(int i = 0; i < numRows; i++)
rs += temp[i];
return rs; }
};
1. 这种方法就比较清晰明了了,该方法关键是把每行的字符串看成一个string,不插入字符的位置就不用考虑(同时也不考虑列的位置了),直接想象成一个连续的字符串;然后定义一个string指针,用来指向每行的string。然后定义一个flag,当行号为0时,一定是每行都有字符的情况,这时候只要行号逐个递增即可;当插入完最后一行时,就是只有某一行又符的情况了,然后从倒数第二个字符开始逐个递减,直至行号为0时。
2.这这种方法相比方法1技巧性更强,我此处说的也不是很清晰,最好的方法就是多读几遍此处的代码,结合题目理解,掌握以下这种技巧会更好。该方法的时间复杂度为O(n),实际提交结果是19ms,立马跑到最快的一类算法上去了...
3.另一个关键点在于,遇到row == 0和row == numRows - 1的时候,row不立马改变,改变的是flag这个变量,而row又是通过flag而改变的,这就相当于能控制row在什么时候改变了;这种技巧是很值得掌握的。
4.这个代码一定要多读,要深刻理解。
LeetCode——6. ZigZag Conversion的更多相关文章
- LeetCode 6. ZigZag Conversion & 字符串
ZigZag Conversion 看了三遍题目才懂,都有点怀疑自己是不是够聪明... 就是排成这个样子啦,然后从左往右逐行读取返回. 这题看起来很简单,做起来,应该也很简单. 通过位置计算行数: P ...
- Leetcode 6. ZigZag Conversion(找规律,水题)
6. ZigZag Conversion Medium The string "PAYPALISHIRING" is written in a zigzag pattern on ...
- LeetCode 6 ZigZag Conversion 模拟 难度:0
https://leetcode.com/problems/zigzag-conversion/ The string "PAYPALISHIRING" is written in ...
- LeetCode 6 ZigZag Conversion(规律)
题目来源:https://leetcode.com/problems/zigzag-conversion/ The string "PAYPALISHIRING" is writt ...
- [LeetCode][Python]ZigZag Conversion
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/zigzag- ...
- 蜗牛慢慢爬 LeetCode 6. ZigZag Conversion [Difficulty: Medium]
题目 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows li ...
- [LeetCode 题解]: ZigZag Conversion
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 The string ...
- [LeetCode] 6. ZigZag Conversion 之字型转换字符串
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- 【leetcode】ZigZag Conversion
题目简述 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows ...
- leetcode 6. ZigZag Conversion
https://leetcode.com/problems/zigzag-conversion/ 题目: 将字符串转化成zigzag模式. 例如 "abcdefghijkmlnpq" ...
随机推荐
- JAVA基础部分复习(五、JAVA反射)
关于反射: 1.需要了解jvm类的加载机制(java高级部分会详细介绍) 2.反射的API其实只要多看看API和源码,很容易就懂了. 下面是代码,简单讲解反射的使用: import java.lang ...
- vs2015连接mysql进行数据库操作
要求:电脑提前安装好vs,mysql. 1.在需要连接mysql的项目上右键选择“属性” -> “C/C++” -> “常规” ->选择“附加包含目录” 在弹出窗口中添加mysql的 ...
- 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】
极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力. 多被称为对抗搜索算法. 这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b. 这个搜索是认为这a与b的 ...
- 云计算SPI(SaaS、PaaS、IaaS)
云计算SPI(SaaS.PaaS.IaaS) The other day, I arrived at the SAP LABS CHINA for interview with my pleasure ...
- maven jar 怎么看jdk编译版本
查看jar包里面MANIFEST.MF文件Build-Jdk的信息 本例中:Build-Jdk:1.7.0_45 解决项目中依赖的jar与jdk冲突.
- Centos7安装32位库用来安装32位软件程序
打算在centos7上安装一个远程控制软件,发现teamviewer只有centos的32位版本,试着安装了一下,各种报错,尝试多次无果.于是试着用向日葵远程控制软件,也报错,貌似也是只支持32位. ...
- photoshop 笔记
替换颜色 (图像)—(调整)—(替换颜色)—点下你想换掉的绿色----拖动下方的滑 块—(色相)拖到最大—(饱合度)调到最小----(明度)调到最大 OK 发现对你不想变色的图像稍微有点影响,但只是一 ...
- 程序设计实践 (Brian W. Kernighan Rob Pike 著)
第1章 风格 1.1 名字 1.2 表达式和语句 1.3 一致性和习惯用法 1.4 函数宏 1.5 神秘的数 1.6 注释 1.7 为何如此费心 第2章 算法与数据结构 2.1 检索 2.2 排序 2 ...
- DevExpress的DateEdit控件正确显示日期的周名称
DevExpress 的控件相当好看而且很好用,但 DateEdit 在是显示周名时,只能显示一个“星”字. 以下是解决方法,此解决方法不需修改其源码,所以免去了重新编译的必要,可直接使用其发布的标准 ...
- nginx+php windows安装配置
https://blog.csdn.net/zjiang1994/article/details/72876193 https://blog.csdn.net/bruce_wang_janet/art ...