将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
解答:
public static String convert(String s, int numRows) {
//考虑极端情况
if (numRows==1) {
return s;
}
char str[][] = new char[numRows][s.length()];
int k=0;
//做初始化工作
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < s.length(); j++) {
str[i][j] ='0';
}
}
for (int j = 0; ; j++) {
for (int m = 0; m < numRows; m++) {
if(k==s.length()){
break;
}
//填充每一列数据【满】
str[m][2*j]=s.charAt(k++);
}
//填充稀疏列数据
for (int n = numRows-2; n >0; n--) {
if(k==s.length()){
break;
}
str[n][2*j+1]=s.charAt(k++);
}
//必须写 否则下述代码不能用
if(k==s.length()){
break;
}
}
//StringBuffer string=new StringBuffer(); time is longer
String string="";
for (int p = 0; p < numRows; p++) {
for (int q = 0; q < s.length(); q++) {
if (str[p][q]!='0') {
//拼接非0字符
//string.append(str[p][q]);
string+=str[p][q];
}
}
}
//return string.toString();
return string;
}
注意:
1.考虑到输出的顺序,其实斜行处理时可以作为一竖行。
2.StringBuilder与StringBuffer与String的比较:
A:运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String【String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,】;
B:在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的;
C:总结一下,String:适用于少量的字符串操作的情况、StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况、StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况。
网友评论