Z 字形变换(6)
这道题之前一直不会做,明白他是什么意思,但是找不到方法或者方法过于繁琐
方法1:
这是我在力扣评论区看到的方法,太精彩了。
虽然我实现起来效率并不高,可能是我代码的问题,但是他的思路很巧妙。
字符串的规律是假如numRows是4
那1234321234321……
将数字一样的拿出来拼接,最终拼在一起
这是我根据这个思路写的代码,有点丑陋
class Solution {
public String convert(String s, int numRows) {
if(numRows < 2) return s;
List<StringBuilder>list=new ArrayList<>(numRows);
char[] array = s.toCharArray();
for (int i = 0; i < numRows; i++) {
list.add(new StringBuilder());
}
int flag=-1;//1是向下 -1是向上
int index=0;
for (int i = 0; i < array.length; i++) {
char c = array[i];
StringBuilder sb = list.get(index);
sb.append(c);
if(index==0||index==numRows-1){
//因为index是从0开始的,所以到了numRow-1,不从1开始的原因是list的索引也是从0开始的
flag=-flag;
}
index+=flag;
}
StringBuilder result=new StringBuilder();
for (StringBuilder stringBuilder : list) {
result.append(stringBuilder.toString());
}
return result.toString();
}
}
方法2:
这个是官方题解,结合他的图也很好理解。特别是他的flag设计得太妙了。
直接使用index+-flag,免去了一次判断
class Solution {
public String convert(String s, int numRows) {
if(numRows < 2) return s;
List<StringBuilder>list=new ArrayList<>(numRows);
char[] array = s.toCharArray();
for (int i = 0; i < numRows; i++) {
list.add(new StringBuilder());
}
int flag=-1;//1是向下 -1是向上
int index=0;
for (int i = 0; i < array.length; i++) {
char c = array[i];
StringBuilder sb = list.get(index);
sb.append(c);
if(index==0||index==numRows-1){
//因为index是从0开始的,所以到了numRow-1,不从1开始的原因是list的索引也是从0开始的
flag=-flag;
}
index+=flag;
}
StringBuilder result=new StringBuilder();
for (StringBuilder stringBuilder : list) {
result.append(stringBuilder.toString());
}
return result.toString();
}
}