题目
这题花了很长时间,难过(ಥ﹏ಥ) 一开始还想到用Map,却感觉越写越复杂。。。
看了一个别人写的,为啥别人想到的办法就这么简单 ̄□ ̄||
只能尽量从中学习一些知识点吧
StringBuilder:StringBuilder是一个可变的字符序列 ,其实质应该是一个字符串。
在 StringBuilder 上的主要操作是 append 和 insert 方法。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。n.append(x) 和 n.insert(n.length(), x) 效果相同
StringBuffer:将StringBuilder的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer。[1]StringBuilder类可以用于在无需创建一个新的字符串对象情况下修改字符串。StringBuilder不是线程安全的,而StringBuffer是线程安全的。但StringBuilder在单线程中的性能比StringBuffer高。
数组的创建:在创建数组时必须指定数组的大小;StringBuilder[] s=new StringBuilder10;
上代码:
public static String convert(String s, int numRows) {
if(numRows<=1) { //如果字符串只分一行显示 则直接返回字符串
return s;
}
char[] C=s.toCharArray(); //将字符串转换成字符数组的方法 String.toCharArray() 方便对每一个字符操作
//创造StringBuilder类型的数组,StringBuilder是一个可变的字符序列
StringBuilder[] sb=new StringBuilder[numRows]; //ziazag每一行可以看成一个StringBuilder,最终结果就是从左往右,从上往下读取字符组成一个字符串
//创造数组对象的方法 必须指定数组大小
String zigzag=""; //定义最终的输出结果
for(int i=0;i<numRows;i++) {
sb[i]=new StringBuilder(""); //定义StringBuilder 并给其赋空值 注:创建一个数组的时候,必须指定数组大小
}
int index=0; //根据实际情况 往不同的StringBuilder里面添加字符 index为StringBuilder数组的下标 sb[0] sb[1] ...sb[numRows-1]
int direct=1;
for(int i=0;i<s.length();i++) { //从字符数组的第一个字符开始往后遍历 从上往下然后有从下往上
sb[index].append(C[i]); //将字符依次存放在不同的StringBuilder里面
if(index==0) { //存放在sb[0] 之后就往下走
direct=1;
}
if(index==numRows-1) { //但不能一直往下 到sb[numRows-1]之后,就应该往上走 依次-1;直到index=0就不再往上,又重新继续往下
direct=-1;
}
index+=direct;
}
for(int i=0;i<numRows;i++) { //横着读 把每一个StringBuilder sb[i]连接起来就是输出结果
zigzag+=sb[i]; //StringBuilder
}
return zigzag;