class Solution {
public String convert(String s, int numRows) {
if (s.length() <= numRows || numRows == 1) return s;
StringBuilder builder = new StringBuilder();
if (numRows == 2) {
for (int i = 0; i < s.length(); i = i + 2) {
builder.append(s.charAt(i));
}
for (int i = 1; i < s.length(); i = i + 2) {
builder.append(s.charAt(i));
}
return builder.toString();
}
//计算二维数组中横向(x轴)的长度
// ((字符串s的长度*2)/ (numRows*2-2))+1 该公式计算的结果可能长度会多出一个索引
int xLen = ((s.length() << 1) / ((numRows << 1) - 2)) + 1;
char[][] cs = new char[numRows][xLen];//用二维数组保存构建的Z字形
//System.out.println(xLen); 计算出来二维数组中x轴的长度
// 按列开始摆放
int i = 0;
for (int x = 0; x < xLen; x++) { //二维数组x轴(横向)
if (x % 2 == 0) {
//二维数组y轴(纵向),保存直线上的元素
for (int y = 0; y < numRows && i < s.length(); y++) {
cs[y][x] = s.charAt(i);
i++;
}
} else {
//二维数组y轴(纵向),保存斜线上的元素
for (int y = numRows - 2; y >= 1 && i < s.length(); y--) {
cs[y][x] = s.charAt(i);
i++;
}
}
}
// 这段代码可以打印构建出来的二维数组
// for (int j = 0; j < cs.length; j++) {
// System.out.println(Arrays.toString(cs[j]));
// }
//将二维数组还原成字符
for (int y = 0; y < numRows; y++) {
for (int x = 0; x < xLen; x++) {//
if(cs[y][x]==0) continue;
builder.append(cs[y][x]);
}
}
return builder.toString();
}
}
class Solution {
static String convert(String s, int numRows){
if (s.length() <= numRows || numRows == 1) return s;
StringBuilder builder = new StringBuilder();
if (numRows == 2) {
for (int i = 0; i < s.length(); i = i + 2) {
builder.append(s.charAt(i));
}
for (int i = 1; i < s.length(); i = i + 2) {
builder.append(s.charAt(i));
}
return builder.toString();
}
char[] chars = s.toCharArray();
int len = chars.length;
int xLen = len*2/(numRows*2 -2) + 1;
char[][] result = new char[numRows][xLen];
int i = 0;
for (int x = 0; x < xLen; x++) {
if(x%2==0){
for (int j = 0; j < numRows&&i<len; j++) {
result[j][x] = chars[i];
i++;
}
}else {
for (int j = numRows-2; j >= 1&& i<len; j--) {
result[j][x] = chars[i];
i++;
}
}
}
StringBuilder stringBuilder = new StringBuilder("");
for (int j = 0; j < numRows; j++) {
for (int k = 0; k < xLen; k++) {
if(result[j][k]==0){
continue;
}
stringBuilder.append(result[j][k]);
}
}
return stringBuilder.toString();
}
}
解法二,每一行定义一个stringbuilder,
class Solution {
public String convert(String s, int numRows) {
if(numRows == 1)
return s;
StringBuilder[] res = new StringBuilder[numRows];
for(int i = 0; i < numRows; i++)
res[i] = new StringBuilder();
int index = 0;
int row = 0;
int len = s.length();
while(index < len){
while(index < len && row < numRows){
char ch = s.charAt(index++);
res[row].append(ch);
row++;
}
if(index == len)
break;
row = numRows - 2;
while(index < len && row >= 0){
char ch = s.charAt(index++);
res[row].append(ch);
row--;
}
row += 2;
}
StringBuilder ans = new StringBuilder();
for(int i = 0; i < numRows; i++)
ans.append(res[i]);
return ans.toString();
}
}
网友评论