Leetcode006:ZigZag Conversion的Java解法

来源:互联网 发布:unity3d流血特效 编辑:程序博客网 时间:2024/06/16 14:51

题目: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   NA P L S I I GY   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”.

原题链接: http://oj.leetcode.com/problems/zigzag-conversion/

思路:
附上一张比较清晰的ZigZag的遍历顺序:
这里写图片描述
numRows为总行数,i为所在行数。由图可知,每行最左和最右两个数值之差为2(numRows-1)。除了第一行和最后一行,中间行的中间元素到该行下一个元素的差值为2*i。因此中间元素到最左边元素的差值为2(numRows-1)-2i。

注:

  1. 边界条件:当字符串为空或是字符串长度小于行数。
  2. 使用了Java的StringBuilder类,是可变字符序列。

下面附上已经submit的代码:

public class Solution{    public String convert(String s,int numRows){        //考虑边界情况        if (s == null || s.isEmpty())        {            return s;        }        int length = s.length();        if(length <= numRows || numRows == 1 )        {            return s;        }        //StringBuilder是可变字符序列          StringBuilder res = new StringBuilder();            int step = 2 * (numRows - 1);        for(int i = 0;i < numRows;i++)        {            int interval = step - 2*i;            for(int j=i;j<length;j+=step)            {                res.append(s.charAt(j));               //除了第一行和最后一行                if(i!=0 && i!= numRows - 1)                {                    int temp = j + step - 2i;                    if(temp<s.length))                 //append方法始终将这些字符添加到缓冲区的末端;                        res.append(s.charAt(temp));                }            }        }        return res.toString();    }}
0 0
原创粉丝点击