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"
.
题意是:给你一个字符串,他是以Z形式表示出来的字符串顺序,然后你以行的形式读出来。给定了字符串的行数。
解题思路:我们发现第一行和最后一行都很好处理,就是每次读取j+2*nRows-2,就是中间的行则需要单独处理。
正如以上的例子,我们发现,我们可以每次选区PAYP作为一个单元处理。就是选取nRows+nRows-2=2nRows-2个长度处理。
那么中间元素的位置关系是j+2*nRows-2i-2(i表示第几行)
ok,代码如下:
public String convert(String s, int nRows) { if (s == null || nRows == 1) return s; int len = s.length(); if (len <= nRows) return s; StringBuffer res = new StringBuffer(); int size = 2 * nRows - 2;//每次处理的长度 for (int i = 0; i < nRows; i++) {//每一行的元素 char ch; for (int j = i; j < len; j += size) { ch = s.charAt(j); res.append(ch); if (i != 0 && i != nRows - 1) {//如果是中间元素单独处理 int tmp = j + size - 2 * i; if (tmp < len) { ch = s.charAt(tmp); res.append(ch); } } } } return res.toString(); }
时间: 2024-10-01 20:48:53