每天一题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;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();
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值