package algorithm;
//Z字型转换
/*
The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
APLSIIG
Y I R
//pay-p-ali-s-hir-i-ng
And then read line by line: “PAHNAPLSIIGYIR”
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert(“PAYPALISHIRING”,3) should return “PAHNAPLSIIGYIR”.
*/
//根据行数 rows,来进行字符串的排列,并计算字符数组的长度
/*
题目大意
输入一个字符串和指定的行数,将字符以Z字型输出。
解题思路
计算出字符的最大列数,根据列数和行数创建一个一维数组,再计算每个字符中一维数组中的位置,再对一维数组中的字符进行紧凑操作,返回结果。
*/
//例子
/*
123456789ABCDEFGHIJKLMNOPQRST
如果rows为4
1 7 D J P
2 6 8 C E I K O Q
3 5 9 B F H L N R T
4 A G M S
规律为:row+row-2=2*row-2,此为等差数列
1->7->D,此为差值为6
2->8->E,此差值为6
6->C->I,此差值为6,C为12,I为18 等等,都满足
An=A1+2*row-2,此为An=A1+6
且2+6=8,3+5=8,1+7=8相邻的值相加同
*/
public class Zswitch {
public static String ZswitchSolution(String inputStr,int rows){
//
if(inputStr==null||inputStr.equals(“”)||inputStr.length()<=rows||rows==1){
return inputStr;
}
int charSize=inputStr.length();
System.out.println(charSize);
int regularNum=rows+rows-2;
int tmp1=charSize/regularNum;
int tmp2=charSize%regularNum;
System.out.println(tmp1+” “+tmp2+” “+regularNum); //3 2 4
int column=0;
if(rows==2){
if(tmp2==0){
column=tmp1;
}else{
column=tmp1+1;
}
}else{
if(tmp2==0){
column=tmp1*2;
}else if(tmp2>0&&tmp2<=rows){
column=tmp1*2+1;
}else{
column=tmp1*2+2;
}
}
System.out.println(“行数为:”+rows+” ,总的列数为:”+column);
char[] source=inputStr.toCharArray();
char[] des=new char[charSize];
int desCircle=-1;
int uniqueColumn=0;//存储第一行或者最后一行与总列数不一致情况
int newColumn=0;
for(int i=0;i<rows;i++){//i表示行数
//总的列数为column,但第一行和最后一行列数可能特殊
if(column%2==0){ //总列数正好相等
uniqueColumn=column/2;
}else{
uniqueColumn=column/2+1;
}
if(rows==2){//2行
System.out.println(“行数为2行,列为=”+column);
//同三行中,除第一行和最后一行的情况–start
newColumn=column;
for(int j=0;j<newColumn;j++){ //列数
desCircle++;
int tmp=i+2*j;
if(tmp>=charSize){ //超出一维数组界限 )))) XX 可合并
desCircle–;
break;
}
des[desCircle]=source[tmp];
}
//同三行中,除第一行和最后一行的情况–end
}else{ //3行及以上—-Z字型 第一行和最后一行特殊–start
if(i==0||i==rows-1){//第一行和最后一行,行的列数与总列数不一致
newColumn=uniqueColumn;
for(int j=0;j<newColumn;j++){ //列数
desCircle++;
int tmp=i+regularNum*j;
if(tmp>=charSize){ //超出一维数组界限
desCircle–;
break;
}
des[desCircle]=source[tmp];
}
}else{ //第二行,行的列数为总的列数—-start
newColumn=column;
for(int j=0;j<newColumn;j++){ //列数
desCircle++;
int tmp=0;
if(j%2==0){//奇数行
tmp=i+regularNum*(j/2);
}else{ //偶数行 –2者相邻相加为regularNum
tmp=(regularNum-i)+regularNum*(j/2);
}
if(tmp>=charSize){ //超出一维数组界限 )))) XX 可合并
desCircle–;
break;
}
des[desCircle]=source[tmp];
}
}//第二行,行的列数为总的列数—-end
} //3行及以上—-Z字型 第一行和最后一行特殊–end
}
System.out.println(String.valueOf(des));
return null;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String inputStr=”PAYPALISHIRING”;
inputStr=”0123456789ABC”;
int rows=2;
ZswitchSolution(inputStr,rows);
}
}