力扣LeetCode第6题Z字型变换
题目:
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
string convert(string s, int numRows);
请你实现这个将字符串进行指定行数变换的函数:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路: 官方说是z字行其实是N字型,这是一个找规律的题目,方法有很多。
1、定义一个二维数组存储N型字符
2、你会发现当 列为行-1的倍数时,那一列的每一行都有数字
3,、那么根据这个规律遍历字符串每个字符,当列为行-1的倍数时(j%(numRows-1)==0),只增加行,如果已经到了最后一行那么行-1,列+1
4、在非列为行-1的倍数时,行-1,列+1,把字符存入当前位置。
代码:
char [] sc =s.toCharArray();
if(sc.length<=numRows||numRows==1){
return s;
}
//二维数组的列数:
int numClos =(sc.length/(numRows-2+numRows))*(numRows-1)+numRows-1;
char [][]res = new char [numRows][numClos];
int i=0,j=0;
for(int x=0;x<sc.length;x++){
if(j%(numRows-1)==0){
res[i][j] =sc[x];
if(i!=numRows-1){
i++;
}else{
i--;
j++;
}
}else{
res[i][j]=sc[x];
i--;
j++;
}
}
s="";
for(i=0;i<numRows;i++){
for(j=0;j<numClos;j++){
if(res[i][j]!='\u0000'){
s+=res[i][j];
}
}
}
return s;
算法专题:力扣LeetCode算法专题