题目:力扣https://leetcode-cn.com/problems/zigzag-conversion/
class Solution {
public String convert(String s, int numRows) {
if(s == null || s.length()<1 || numRows ==1){
return s;
}
StringBuilder[] array = new StringBuilder[numRows];
for(int i=0;i<numRows;i++){
array[i] = new StringBuilder();
}
int index=0;
int dir = 1;
for(char c:s.toCharArray()){
array[index].append(c);
index = index+dir;
if(index==0 || index==numRows-1){
dir = -dir;
}
}
StringBuilder ans = new StringBuilder();
for(int i =0; i< numRows;i++){
ans.append(array[i]);
}
return ans.toString();
}
}
思路: 一开始是想用char的二维数组按部就班真的把“z”型画出来,但是发现效率太低,而且操作起来麻烦。然后学习了StringBuilder,并使用StringBuilder完成了这题。大概思路也改变了,类似于俄罗斯方块,取一个字符然后让它对号入座放入对应的StringBuilder数组。
String/StringBuilder/StringBuffer:对字符串需要进行修改时,使用StringBuilder和StringBuffer要优于String,因为StringBuilder、StringBuffer类的对象可以被多次修改,而不产生新的未使用对象。而StringBuilder与StringBuffer之间也存在着区别,StringBuilder优点是执行速度快,但缺点为线性不安全;而StringBuffer与其对比则恰好相反。一般情况下大概率使用StringBuilder,除非有安全性的要求。
1.对特殊情况进行处理。如果传入的字符串为空(字符串长度小于1),或者给定的行数为1行,则直接返回s就好了。
if(s == null || s.length()<1 || numRows ==1){
return s;
}
2.声明StringBuilder数组,数组中存若干StringBuilder对象。给定的行数则是StringBuilder对象的个数。
StringBuilder[] array = new StringBuilder[numRows];
for(int i=0;i<numRows;i++){
array[i] = new StringBuilder();
}
}
3.将字符串的每个字符对号入座,通过append()添加到对应的StringBuilder对象中。index是索引,用于表示各个StringBuilder。dir是方向,表示需要上行或者下行,若index到了临界点则需要更改dir的值。
int index=0;
int dir = 1;
for(char c:s.toCharArray()){
array[index].append(c);
index = index+dir;
if(index==0 || index==numRows-1){
dir = -dir;
}
}
4.再声明一个新的StringBuilder对象ans。然后将上述StringBuilder数组中各个StringBuilder元素通过append()的方法合并到ans。
StringBuilder ans = new StringBuilder();
for(int i =0; i< numRows;i++){
ans.append(array[i]);
}
5.因为本题给定的方法是String类型的,所以在最后返回ans时需要将其通过.toString转化为String类型。
return ans.toString();