美文网首页leetcode-algorithm
leetcode-006 ZigZag Conversion

leetcode-006 ZigZag Conversion

作者: hylexus | 来源:发表于2016-09-16 17:56 被阅读19次

    [TOC]

    P006 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)

    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".

    思路分析

    5行 6行

    最终结果就是将上图中每一行的内容去掉中间间隔连接起来

    所以最直观的方法就是:

    • 生成类似上图的结构(二维数组???)
    • 去掉间隔
    • 连接每一行

    另外:

    若使用二维数组,最终连接的时候还得去掉空白。所以可以使用特殊的二维数组--一维字符串数组来保存上述结构的同时去掉间隔。

    代码

    java

    import java.util.Arrays;
    public class Solution006 {
        public String convert(String s, int numRows) {
            if (s == null || s.length() == 0 || numRows <= 1)
                return s;
            String rows[] = new String[numRows];
            Arrays.fill(rows, "");
            boolean down = true;
            int row = 0;
    
            for (int i = 0; i < s.length(); i++) {
                rows[row] += s.charAt(i);
    
                if (down) {
                    row++;
                } else {
                    row--;
                }
    
                if (row >= numRows) {
                //不是减一,因为第一行行最后一行都是一个元素
                    row = numRows - 2;
                    down = false;
                }
    
                if (row < 0) {
                //不是零,因为第一行行最后一行都是一个元素
                    row = 1;
                    down = true;
                }
    
            }
    
            StringBuilder sb = new StringBuilder();
            for (String r : rows) {
                sb.append(r);
            }
            return sb.toString();
        }
    }
    
    

    python

    class Solution006(object):
        def convert(self, s, numRows):
            """
            :type s: str
            :type numRows: int
            :rtype: str
            """
            if not s or len(s) == 0 or numRows <= 1:return s
            
            rows = [""] * numRows
            
            down = True;row = 0;
            
            for e in s:
                rows[row] += e
                
                if down:
                    row += 1
                else:
                    row -= 1
                
                
                if row >= numRows:
                    row = numRows - 2
                    down = False
    
                if row < 0:
                    row = 1
                    down = True
            
            # end for
            
            ret = ""
            for e in rows:
                ret += e
            
            return ret
    

    此处有个更牛逼的解法:http://www.cnblogs.com/sanghai/p/3632528.html

    相关文章

      网友评论

        本文标题:leetcode-006 ZigZag Conversion

        本文链接:https://www.haomeiwen.com/subject/bjdiettx.html