题目
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);
示例 1:
输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”
示例 2:
输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”
突然发现英文社区可以把信息同步到中文社区,那还看什么英文,中文不好吗
思路
这道题呢就是给定一个字符串,按照规定的形式重新排列后进行输出。给定的形式就是横放的Z,也可以看做是特殊形态的V,看你怎么想了,反正都那样。
最开始我在想能不能找到相应的规律,也就是找到一个特殊的函数,直接把两者对应起来,结果找了半天没找到,原谅我的渣渣数学,之后做出来了,大致看了一下大神们的代码,感觉好像是有相应的函数的,但是不想再看了,也就没有在研究这个了。
之后我做题的时候突然想起来能不能用递归的算法来解决,但是仍然是凉凉,递归不好用,毕竟用的话参数可能会有点多。
最后采用的是,设置一组坐标,依次判断下一个坐标的位置,然后循环N次将每一个字符填入相应的位置。
需要注意的就是,只排列成一行和两行的情况,比较特殊,注意处理。
代码
public class T006 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println( convert( "LEETCODEISHIRING", 3 ) );
}
public static String convert(String s, int numRows) {
//如果是只排列成一行的话,原样输出就可以了
if(numRows == 1 )
return s;
//用于存储每一行的字符串,并输出
StringBuilder[] rows = new StringBuilder[numRows];
for( int i = 0; i < numRows; i++ )
rows[i]= new StringBuilder();
int count = 0;
int i = 1;
int j = 1;
//循环那么多次,得到结果
while( count < s.length() ) {
//用来判断排列到那一列了,循环到竖着的一列判定为真
if( i%(numRows-1) == 1 || numRows == 2 ) {
rows[j-1].append(s.charAt( count++ ));
//rows[j-1] += s.charAt( count++ )+"";
//用于判断是不是到这一列的尽头了,是的话就跳的下一列,上一行;否则行加一
if( j+1<=numRows )
j++;
else{
i++;
j--;
}
}else {
rows[j-1].append(s.charAt( count++ ));
//rows[j-1] += s.charAt( count++ )+"";
i++;
j--;
}
}
String output = "";
for( int k = 0; k < numRows; k++ ) {
output += rows[k].toString();
//System.out.println( k+"row:\t" + rows[k] );
}
return output;
}
}
来源:CSDN
作者:Le.diablew
链接:https://blog.csdn.net/weixin_45980031/article/details/103465931