力扣LeetCode第6题Z字型变换

力扣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算法专题

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值