每天一题LeetCode [第一天]

每天一题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;inew StringBuilder();
        int i=0,len=text.length();
        while (i//vertical down
            for(int id=0;id//obliquely up
            for(int id=nRows-2;id>=1 && i//add all sb
        for(int id=1;id0].append(sbs[id]);
        }
        return sbs[0].toString();
    }
}

提高代码质量就是:每天积累精美的思路,优质的细节的过程。

你可能感兴趣的:(LeetCode)