Leet Code 6 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" .


【算法思路】

首先自己写一串字符串,给不同的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 element
13:          if(i ==0 || i == nRows-1)   //green element
14:          {            
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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anyanyamy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值