Leet Code 6 ZigZag Conversion

来源:互联网 发布:淘宝类目007是什么牌子 编辑:程序博客网 时间:2024/05/01 06:37

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


【算法思路】

首先自己写一串字符串,给不同的numRows来看结果是什么,然后找规律啊。

我发现按照行进行遍历,打印完行首字符后,以后都是每两个(设为: a,b)一起出现(除非b越界了),a距离a所在行首的间隔为 2*numRows - 2 - 2*i 

i 为所在行号,从0开始。 b距离a的间隔为  2*i。

因此可以每次都打印有效的a,b,依次遍历。对于首行和尾行可以特殊考虑。


【复杂度】

时间: O(n)


【CODE】

public String convert(String s, int numRows) {int len = s.length();if (numRows <= 1 || len <= numRows) {return s;}StringBuilder sb = new StringBuilder();int tmp = 2 * numRows - 2;sb.append(s.charAt(0));for (int index = tmp; index < len; index += tmp) {sb.append(s.charAt(index));}for (int i = 1; i < numRows - 1; i++) {int index = tmp - 2 * i;sb.append(s.charAt(i));while (index + i < len) {sb.append(s.charAt(index + i));if (index + 3 * i < len) {sb.append(s.charAt(index + 3 * i));} else {break;}index += tmp;}}int index = numRows - 1;while (index < len) {sb.append(s.charAt(index));index += tmp;}return sb.toString();}


2. 数学题。巨无聊的一道题,真正面试过程中,不大可能出这种问题。
n=4
P              I              N
A         L  S         I   G
Y   A       H    R
P              I

N=5
P               H
A          S  I
Y      I       R
P   L          I      G
A              N

所以,对于每一层主元素(红色元素)的坐标 (i,j)= (j+1 )*n +i
对于每两个主元素之间的插入元素(绿色元素),(j+1)*n -i

[Code]

1:    string convert(string s, int nRows) {  2:      // Start typing your C/C++ solution below  3:      // DO NOT write int main() function    4:      if(nRows <= 1) return s;  5:      string result;  6:      if(s.size() ==0) return result;  7:      for(int i =0; i< nRows; i++)  8:      {  9:        for(int j =0, index =i; index < s.size();   10:            j++, index = (2*nRows-2)*j +i)  11:        {  12:          result.append(1, s[index]);  //red element13:          if(i ==0 || i == nRows-1)   //green element14:          {            15:            continue;  16:          }  17:          if(index+(nRows- i-1)*2 < s.size())  18:          {  19:            result.append(1, s[index+(nRows- i-1)*2]);  20:          }  21:        }  22:      }  23:      return result;  24:    } 

0 0
原创粉丝点击