2015年2月1日星期日

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


  1. public String convert(String s, int nRows) {  
  2.     if(s == null || s.length()==0 || nRows <=0)  
  3.         return "";  
  4.     if(nRows == 1)  
  5.         return s;  
  6.     StringBuilder res = new StringBuilder();  
  7.     int size = 2*nRows-2;  
  8.     for(int i=0;i<nRows;i++)  
  9.     {  
  10.         for(int j=i;j<s.length();j+=size)  
  11.         {  
  12.             res.append(s.charAt(j));  
  13.             if(i!=0 && i!=nRows-1 && j+size-2*i<s.length())  
  14.                 res.append(s.charAt(j+size-2*i));  
  15.         }                  
  16.     }  
  17.     return res.toString();  
  18. }  
http://blog.csdn.net/linhuanmars/article/details/21145039

/*n=numRows Δ=2n-2 1 2n-1 4n-3 Δ= 2 2n-2 2n 4n-4 4n-2 Δ= 3 2n-3 2n+1 4n-5 . Δ= . . . . . Δ= . n+2 . 3n . Δ= n-1 n+1 3n-3 3n-1 5n-5 Δ=2n-2 n 3n-2 5n-4 */

public class Solution {
    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();
    }
}