您的位置:首页 > 编程语言 > Java开发

LeetCode java实现ZigZagConversion

2015-07-21 14:21 453 查看
题目地址: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;
	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: