题目描述:
方法1:二维数组
解题思路:二维数组的方法是最暴力的,但是时间复杂度和空间复杂度都很高
代码:
class Solution {
public String convert(String s, int numRows) {
int len = s.length();
int count = 0;
int V = 2 * numRows - 2;
int column = numRows - 1;
if(numRows == 1 || V == 0) {
return s;
}
int m = len / V;
int n = len % V;
column *= m;
String str = "";
if(n != 0) {
if(n < numRows) {
column += 1;
}else {
column = column + 1 + n - numRows;
}
}
char [][]nums = new char[numRows][column];
for(int i = 0; i < column; i++) {
if(count >= len) {
break;
}
for(int j = 0; j < numRows; j++) {
if(count >= len) {
break;
}
if((i % (numRows-1)) == 0) {
nums[j][i] = s.charAt(count);
count++;
}else {
if((i % (numRows-1)) + j == numRows-1) {
nums[j][i] = s.charAt(count);
count++;
}
}
}
}
for(int i = 0; i < numRows; i++) {
for(int j = 0; j < column; j++) {
if(nums[i][j] != 0) {
str = str + nums[i][j];
}
}
}
return str;
}
}
- 时间复杂度:O(n²)
- O(n²)
方法2:
解题思路:
public static String convert(String s, int numRows) {
//创建一个集合保存每一行的数据
ArrayList<StringBuilder> list = new ArrayList<>();
// 创建 和行数相同的数据
for (int i=0; i<numRows;i++) list.add(new StringBuilder());
//反转的下标和 反转的内容
int i = 0,flag=-1;
for (char c : s.toCharArray()){
//追加到第n个
list.get(i).append(c);
if (i==0 ||i==numRows-1) flag=-flag;
i+=flag;
}
//string 来组合
StringBuilder res = new StringBuilder();
//遍历塞入 res
list.forEach((a)->{res.append(a);});
return res.toString();
}
- 时间复杂度:O(n),其中 n = len(s)
- 空间复杂度:O(n)