每天一题LeetCode【第1天】
2017-01-21 本文已影响1609人
草稿纸反面
T6. ZigZag Conversion 【Easy】
题目
把字符串 "PAYPALISHIRING" 用ZiaZag(曲折)的形式,在给定的数字(很据后面我推测它这里指的是3)下表示如下
P A H N
A P L S I I G
Y I R
然后对它一行行读取,就变成了 "PAHNAPLSIIGYIR"
写如下的一个方法,传参一个String和一个int,返回一个string:
string convert(string text, int nRows);
如果执行方法 convert("PAYPALISHIRING", 3) ,应该返回 "PAHNAPLSIIGYIR"
代码
代码参考 Top Solution,稍作注释
public String convert(String s, int nRows) {
//转化成char字符数组方便后面使用
char[] c = s.toCharArray();
//得到输入的字符数量
int len = c.length;
//用StringBuffer,后面详说
StringBuffer[] sb = new StringBuffer[nRows];
for (int i = 0; i < sb.length; i++) sb[i] = new StringBuffer();
int i = 0;
//关键代码,通过i++一个个读完
while (i < len) {
for (int idx = 0; idx < nRows && i < len; idx++) // vertically down
sb[idx].append(c[i++]);
for (int idx = nRows-2; idx >= 1 && i < len; idx--) // obliquely up
sb[idx].append(c[i++]);
}
//把几行并到一起,然后输出
for (int idx = 1; idx < sb.length; idx++)
sb[0].append(sb[idx]);
return sb[0].toString();
}
思路
把事例的那个文字输入我觉得换成下面那样更容易理解(因为这样看上下看着对称感觉不会造成不必要的误解吧)
P A H N
A P L S I I G
Y I R
- 把输入转成char字符数组,可以方便提取每一个字符,以及得到总字符长度
- 用StringBuffer(下有补充)和i++来一个个用V字型读取,其中控制条件idx++是向下读取,idx--是向上读取
- 最后把几个StringBuffer(各代表一行)并到一起输出