Z字型转换

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);
    }

}
 

    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/zyzn1425077119/article/details/85065030
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞