算法六: Z 字形变换

算法内容

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:z字行排列
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion

算法思想

“Z”字形可以通过行元素下标之间的差距来进行元素重新整合。以行号为初始循环体,再以字符串长度为嵌套循环。

if(numRows==1){
    
    //若行号为1时直接输出
    return s;
}
for(int i=0;i<numRows;i++){
    
    
    /**
     * num用来指定元素位置
     * count用来表示每行元素之间的差距
     * */
    num=i;
    count=sum-num*2;
    while(num<s.length()){
    
    
        q+=s.charAt(num);
        if(count==0||count==sum){
    
    //这个条件表示第一行和最后一行
            num+=sum;
        }else{
    
    //除第一行和最后一行的其他行
            /**
             * num+count表示下一个元素的位置
             * sum-count表示下一个元素距离上一个元素的差距(大家可以画一下行数为4)
             * */
            num=num+count;
            count=sum-count;
        }
    }
}

算法思想

整体算法

public class Day_06 {
    
    
    static Scanner input=new Scanner(System.in);
    public static String convert(String s, int numRows) {
    
    
        int sum=2*(numRows-1);
        int num;
        int count;
        String q=new String();
        if(numRows==1){
    
    
            return s;
        }
        for(int i=0;i<numRows;i++){
    
    
            num=i;
            count=sum-num*2;
            while(num<s.length()){
    
    
                q+=s.charAt(num);
                if(count==0||count==sum){
    
    
                    num+=sum;
                }else{
    
    
                    num=num+count;
                    count=sum-count;
                }
            }
        }
        return q;
    }
    
    public static void main(String[] args) {
    
    
        String s=input.nextLine();
        int num=input.nextInt();
        String q=convert(s,num);
        System.out.println(q);
    }
}

尾语

以上属于个人见解,有好的想法可以在下方评论写出自己的想法,大家一起进步。该题是力扣上的题,若有侵权,请及时告知。该题链接:https://leetcode-cn.com/problems/zigzag-conversion

猜你喜欢

转载自blog.csdn.net/weixin_40741512/article/details/112596682