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);
示例:
个人解题思路:
1、感觉可以使用特殊的找规律方法来写,以示例2 举例,通过观察后,我们可以发现只需要遍历前numRows个数据然后通过算术进行横向扩展拿到数据即可
2、在进行观察后,我们可以发现除了第一个数以及第一列最后一个数以外,其他行数据中,都是通过加两种(差数)来获取下一个值,比如第一个A第一次获取下一个值是+4,第二次+2,一直保持这个规律,因此我们可以设置gapNum1、gapNum2,然后使用一个flag标志位来判断此次是+哪一个gapNum。
3、通过找规律我们可以发现gapNum1 的值为 2(numRows-i)-2* ,gapNum2的值为 2*i,当然,首位与末尾除外,所以我们还需要单独处理这种情况
简略图解:
完整代码:
public String convert(String s, int numRows) {
if(numRows==1){
return s;
}
int gapNum1;
int gapNum2;
StringBuilder str=new StringBuilder("");
boolean flag = true;
for(int i=0;i<numRows;i++){
gapNum1=2*(numRows-i)-2;
gapNum2=2*i;
if(i==0||i==numRows-1){
gapNum1=gapNum2=2*numRows-2;
}
int x = i;
flag = true;
while(x<s.length()){
if(flag){
str.append(s.charAt(x));
x+=gapNum1;
}else{
str.append(s.charAt(x));
x+=gapNum2;
}
flag=!flag;
}
}
return str.toString();
}