leetcode的每日一题更新(ZigZag Conversion)

题目: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)
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".
意思就是大概就是

leetcode的每日一题更新(ZigZag Conversion)_第1张图片
S.png

给一个字符串和行数,倒Z排列好了以后,最后返回的字符串是所有的行拼接起来的。abcdefghijklmn,numRows=5,输出字符为aibhjcgkdflnem
思路:一开始就想好了把上下和中间分隔开来,这样就简单一点,上和下的代码都一样,只是循环的起点不一样,距离都是numRows+numRows-2,中间有点麻烦,刚开始想错了,以为它每一丨都是从上到下依次的来,写完提交以后才发现是z字形的,然后只要重写中间的代码就行,仔细看了一下中间的数字规律就是:第一个字母不用说是i,第二个是(numRows-i) 2,第三个是i2-1,然后又是(numRows-i)*2,一直循环,想了想只能靠一个boolean来控制这样的转换用来控制取字母的循环变量。附上我的代码:

    public String convert(String s, int numRows) {
        if(s=="")return "";
        if(numRows<2)return s;
        String result="";
        
        boolean bian=true;
        for(int i=0;i

测试了一下别人的代码和我的代码,别人用了1ms,我用了18。。。。。
好好研究学习一下,这一篇文章就这样

    public String convert(String s, int nRows) {
        char[] c = s.toCharArray();
        int len = c.length;
        StringBuffer[] sb = new StringBuffer[nRows];
        for (int i = 0; i < sb.length; i++) sb[i] = new StringBuffer();
        
        int i = 0;
        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();
    }

你可能感兴趣的:(leetcode的每日一题更新(ZigZag Conversion))