题目
代码实现:
方法一(二维数组法):
这是用二维数组作为存储结构,双指针定位构造Z字形的代码。
col%(numRows-1) == 0是用来判断col列是不是整列,整列即该列应该全部是字符的列。
class Solution {
public String convert(String s, int numRows) {
int len = s.length();
//如果是一行,返回就是原字符串
if(numRows == 1){
return s;
}
char[][] ch = new char[numRows][len];
//构造出一个存储Z字形字符串的存储结构
for(int i = 0;i < numRows;i++){
for(int j = 0;j < len;j++){
ch[i][j] = '0';
}
}
int row = 0,col = 0;
for(int i = 0;i<len;i++){
//这是整列有字符的情况,if中if是将指针移到下一个应该放字符但还是空的二维数组位置
if(col%(numRows-1) == 0 && row < numRows){
ch[row][col] = s.charAt(i);
if(row==numRows-1){
col++;
row--;
continue;
}
row++;
}else{//两个整列之间上升的部分,row--,else中的if也是指针移动
if(col < len && row >=0){
ch[row][col] = s.charAt(i);
if(row == 0){
col++;
row++;
continue;
}
row--;
col++;
}
}
}
String str = new String();
for(int i = 0;i < numRows;i++){
for(int j = 0;j < len;j++){
if(ch[i][j] != '0'){
str+=ch[i][j];
}
}
}
return str;
}
}
结果:
方法二(list法):
使用list作为存储结构,无形中就解决了二维数组中col(列)的问题,就要考虑行row怎么变换就行了。
其实仔细思考就是row=0,row=numRows-1时,row应该做什么的问题。
row的两个状态可以用高中物理中的“临界状态”理解。
class Solution {
public String convert(String s, int numRows) {
if(numRows < 2){
return s;
}
List<StringBuilder> list = new ArrayList<StringBuilder>();
for(int i = 0;i < Math.min(numRows,s.length());i++){//结合实际情况,可能会有row>s.length()和row小于的情况,空间没必要浪费
list.add(new StringBuilder());
}
char[] ch = s.toCharArray();
int row = 0;
boolean flag = false;
for(char c : ch){//这里row可以用二维数组row和col的定位方式来理解,只是list这种方式不用col来定位。
list.get(row).append(c);
if(row == 0){
flag = true;
}
if(row == numRows-1){
flag = false;
}
if(flag){
row++;
}else{
row--;
}
}
StringBuilder sB = new StringBuilder();
for(StringBuilder sb : list){
sB.append(sb);
}
return sB.toString();
}
}
结果: