题目地址: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;
}