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 RAnd 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"
.
题目翻译:根据ZIGZAG模式,翻译字符串,模型如下
Zigzag:即循环对角线结构
0 | 8 | 16 | |||||||||
1 | 7 | 9 | 15 | 17 | |||||||
2 | 6 | 10 | 14 | 18 | |||||||
3 | 5 | 11 | 13 | 19 | |||||||
4 | 12 | 20 |
向下循环:nRows
斜角线循环:nRows-2(减去首尾两个端点)
Code:
import java.util.HashMap;
import java.util.Map;
/**
*
*/
/**
* @author MohnSnow
* @time 2015年6月1日 下午5:01:05
*
*/
public class LeetCode6 {
/**
* @param argsmengdx
* -fnst
*/
public static String convert(String text, int nRows) {
if (nRows == 1) {
return text;
}
Map<Integer, StringBuilder> result = new HashMap<>(nRows);
int eachRoundNumber = 2 * nRows - 2;//循环一组的下标长度
for (int i = 1; i <= nRows; i++) {//map初始化
result.put(i, new StringBuilder());
}
for (int i = 1; i <= text.length(); i++) {//模拟过程
int key = i % eachRoundNumber;
key = key == 0 ? eachRoundNumber : key;//巧妙使用三目运算符
key = key <= nRows ? key : nRows - (key % nRows);
result.get(key).append(text.charAt(i - 1));//字符起始位置为0
}
StringBuilder rest = new StringBuilder();//整合结果
for (int i = 1; i <= nRows; i++) {
rest.append(result.get(i));
}
return rest.toString();
}
public static String convert1(String text, int nRows) {
if (nRows == 1) {
return text;
}
Map<Integer, StringBuilder> result = new HashMap<>(nRows);
int eachRoundNumber = 2 * nRows - 2;//循环一组的下标长度
for (int i = 1; i <= nRows; i++) {//map初始化
result.put(i, new StringBuilder());
}
for (int i = 1; i <= text.length(); i++) {//模拟过程
int key = i % eachRoundNumber;
if (key == 0) {
result.get(2).append(text.charAt(i - 1));
}else if (key <= nRows) {
result.get(key).append(text.charAt(i - 1));
} else {
result.get(2 * nRows - key).append(text.charAt(i - 1));
}
}
StringBuilder rest = new StringBuilder();//整合结果
for (int i = 1; i <= nRows; i++) {
rest.append(result.get(i));
}
return rest.toString();
}
public static void main(String[] args) {
String s = "abcdefadfg";
int a = 3;
System.out.println(s + "2");
System.out.println(convert(s, a));
System.out.println(convert1(s, a));
}
}