Leetcode: ZigZag Conversion

来源:互联网 发布:js如何实现弹窗 编辑:程序博客网 时间:2024/06/02 02:35

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


This can be done mathematically.  Note the step 2(nRows - 1). O(n) time and O(1) space. Code is as follows:

public String convert(String s, int nRows) {      if(s == null || s.length()==0 || nRows <=0)          return "";      if(nRows == 1)          return s;      StringBuilder res = new StringBuilder();      int size = 2*nRows-2;      for(int i=0;i<nRows;i++)      {          for(int j=i;j<s.length();j+=size)          {              res.append(s.charAt(j));              if(i!=0 && i!=nRows-1 && j+size-2*i<s.length())                  res.append(s.charAt(j+size-2*i));          }                      }      return res.toString();  }

Can also use an string array of size nRows, for less computation. Put the characters in the nRows strings in a zigzag order, and concatenate them.  This requires O(n) time and O(nRows) space.

public class Solution {    public String convert(String s, int nRows) {        if (s == null || s.length() == 0) {            return s;        }                StringBuilder[] sbs = new StringBuilder[nRows];        for (int i = 0; i < nRows; i++) {        sbs[i] = new StringBuilder();        }        int pos = 0;        boolean topDown = true;        for (int i = 0; i < s.length(); i++) {            sbs[pos].append(s.charAt(i));            if (nRows != 1) {            if (topDown) {            pos++;            } else {            pos--;            }            }            if (pos == nRows - 1) {                topDown = false;            } else if (pos == 0) {                topDown = true;            }        }                StringBuilder res = new StringBuilder();        for (int i = 0; i < nRows; i++) {            res.append(sbs[i]);        }                return res.toString();    }}


0 0