题目
解题思路
-
这道题的思路关键是: 使用StringBuilder类型
-
因为 StringBuilder是一个可修改的字符串对象,StringBuilder类型的字符串可以增长或剪切。
-
所以在进行解题时,只需要判断字符应该放在哪一行(哪一个StringBuilder)中,就把这个字符加到对应的StringBuilder中即可,也不需要说明放在StringBuilder的哪个位置 只需要append就行StringBuilder.append()。
-
所以这道题的关注力只需要集中在哪个字符应该出现在第几行,即可。
java语法知识
- 以StringBuilder作为一种可变数据类型,创建链表。
- append()方法、add()方法、toString()方法、s.toCharArray()方法的使用。
关键代码解释
for(char c:s.toCharArray()){
//s.toCharArray()方法是将s字符串打碎,装进CharArray数组里,通过加强版的for循环,将每一个字符在每次循环里传递给字符c
rows.get(curRow).append(c);
//
if(curRow==0||curRow==numRows-1){
goingDown=!goingDown;
//当 当前行为第一行或者在最后一行,那么就转变goingdown的方向。
}
这行代码主要实现了将字符串转化成一个个的字符,并逐个添加到StringBuilder的row中,对应所在行。
curRow+=goingDown?1:-1;
这行代码就是先判断 goingdown?1:-1 向下则curRow+=1 向上则curRow+=-1
java代码与运行结果
class Solution{
public String convert(String s,int numRows){
if(numRows==1){
return s;
}
List<StringBuilder> rows=new ArrayList<>();
//创建一个StringBuilder类型的List列表,并且属于是链表类型
for(int i=0;i<Math.min(numRows,s.length());i++){
rows.add(new StringBuilder());
//给新创建的链表内,每行都实例化StringBuilder对象。
}
int curRow=0;
//确定当前在哪行
boolean goingDown=false;
for(char c:s.toCharArray()){
//s.toCharArray()方法是将s字符串打碎,转化到CharArray数组里,通过加强版的for循环,将每一个字符在每次循环里传递给字符c
rows.get(curRow).append(c);
if(curRow==0||curRow==numRows-1){
goingDown=!goingDown;
//当 当前行为第一行或者在最后一行,那么就转变goingdown的方向。
}
curRow+=goingDown?1:-1;
//这行代码就是先判断 goingdown?1:-1 向下则curRow+=1 向上则curRow+=—1
}
StringBuilder ret = new StringBuilder();
//创建StringBuilder实例化对象
for(StringBuilder row:rows){
ret.append(row);
//把字符串合并起来
}
return ret.toString();
}
}
运行结果截图