LeetCode java实现ZigZagConversion

题目地址:https://leetcode.com/problems/zigzag-conversion/

题目内容:就是说假设有一个字符串及行数,那么我们可以把他按顺序摆成一个锯齿的形状,例如,给定的字符串为"abcdefghijklmnopq",给定行数是4,那么可以把它摆成如下的锯齿形状:

	/**
	 * abcdefghijklmnopq
	 * 
	 * a     g     m
	 * b   f h   l n
	 * c e   i k   o q
	 * d     j     p
	 * 
	 * 
	 */

现在,我们需要根据摆成的锯齿形状,得到一个新的字符串,这个字符串是按行读取的,忽略空格。也就是"agmbfhlnceikoqdjp"。

好了,大意就是这样,那么该如何解呢?大部分解法都是计算位置,就是找规律,得到每一行会有哪些位置的字符。这种解法当然是可以的,也很简单。现在我提供另一种思路:按顺序模拟字母的摆放过程。假如给定字符串是"abcdefghijk",给定行数是5,那么我们该如何摆呢?我们新建5个字符串来存放每一行的字符,a肯定放在第一行,则第一行加上a,b放在第二行则第二行加上b...只要注意拐弯就好。拐弯也很简单,以前是行数加一,则拐弯就变成行数减一。思路很清晰,具体代码如下:

	public String convert(String s,int numRows){
		String result = "";
		List<String> lines = new ArrayList<String>();
		for(int i=0;i<numRows;i++){
			lines.add("");
		}
	
		int size = s.length();
		int linePoint = 0;
		boolean addMode = true;
		for(int j=0;j<size;j++){
			lines.set(linePoint,lines.get(linePoint)+s.charAt(j));
			if (addMode) {
				linePoint++;
				if(linePoint>numRows-1&&numRows>1){
					linePoint = numRows-2;
					addMode = false;
				}else if (linePoint>numRows-1) {
					linePoint = 0;
					addMode = false;
				}
			}else {
				linePoint--;
				if(linePoint<0&&numRows>1){
					linePoint = 1;
					addMode = true;
				}else if (linePoint<0) {
					linePoint = 0;
					addMode = true;
				}
			}
		}
		int lineSize = lines.size();
		for(int k=0;k<lineSize;k++){
			result = result +lines.get(k);
		}
		return result;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值