每天一题LeetCode [第一天]
ZigZagConversion
Description:
The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I R
And then read line by line: “PAHNAPLSIIGYIR”
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.
解题过程:
一开始在理解题目意识的时候,就出错了。。所以快速搞懂题目意识这方面,我还是比较欠缺的。
在搞懂题目意识之后,基本方向就是一个类似二维数组,一开始把东西按垂直向下的方向填充完,在拼起来输出,大致思路如此,一般人都可以想到。关键在于是否能把具体细节上的代码撸得漂亮。 一开始是想直接开个char二维数组 一个一个搞,但是这样的想法太Naive的,因为效率低低,而且开多大也是个问题。后来看了标答:用Java 写的,感觉确实漂亮。具体代码看下文,有点在于,在Java中,对字符串的处理,能用StringBuilder尽量用StringBuilder (切记StringBuffer是线程安全,这个是线程不安全的,但是效率更高)。二维数组就用一维的StringBuilder来代替,具体内部循环可以这样看,一次循环完成一次的垂直向下填充+斜斜上上填充,而添加判断,就是判断字符串i下标是否有木有超出。
Java代码:
public class ZigZagConversion {
private static final String TAG=ZigZagConversion.class.getSimpleName();
public String zigZagConvet(String text,int nRows){
//change to char array --convenience to use
char [] c=text.toCharArray();
StringBuilder[] sbs=new StringBuilder[nRows];
//init sb
for(int i=0;i<sbs.length;i++)
sbs[i]=new StringBuilder();
int i=0,len=text.length();
while (i<len){
//vertical down
for(int id=0;id<nRows && i<len;id++){
sbs[id].append(c[i++]);
}
//obliquely up
for(int id=nRows-2;id>=1 && i<len;id--){
sbs[id].append(c[i++]);
}
}
//add all sb
for(int id=1;id<sbs.length;id++){
sbs[0].append(sbs[id]);
}
return sbs[0].toString();
}
}
提高代码质量就是:每天积累精美的思路,优质的细节的过程。