给定一个字符串的行数,从上往下,从左到右排序,比如输入字符串“LEETCODEISHIRING”行数为3 结果为: L C I R E T O E S I I G E D H N
实现思路1
从左到右遍历字符串,之后确定当前字符位于Z字形图案的哪一行。假设此时的numRows=3,在移动过程中,需要两个变量:当前行和当前方向,且只有移动到第一行和最后一行的时候,才需要转变方向。最后再将每一行的拼接到一起即可。
代码实现1
String convert(String s,int numRows){
StringBuilder[] sb = new StringBuilder[numRows]; //创建指定空间的StringBuilder数组
char[] chars = s.toCharArray(); //获取字符串中的每个元素并存放到char数组中
int i = 0;
int row = 0;
for (int q=0;q<sb.length;q++){
sb[q]=new StringBuilder();
}
boolean flag = false;
while (i<chars.length){
sb[row].append(chars[i]);
i++;
if (row==0||row==numRows-1) //当到达上限或下限时翻转遍历方向
flag = !flag;
row = row+(flag?1:-1); //为ture则向上遍历,为false则向下遍历
}
StringBuilder b=new StringBuilder();
for(int j=0;j<sb.length;j++) //拼接字符串
{
b.append(sb[j]);
b.append("\n");
}
String temp=b.toString();
return temp;
}
}
代码实现2
String[] convert(String s,int numRows){
boolean flag=false;
String[] res=new String[numRows];
int loc=0;
for(int i = 0; i < s.length(); i++) {
res[loc] += s.substring(i, i + 1);
//在第一行或最后一行则需要反方向遍历
if (loc == 0 || loc == numRows - 1)
flag = !flag;
//如果flage为true,表示向下遍历
loc += flag ? 1 : -1;
}
return res;
}