【leetcode】6. Z 字形变换

By | 3月 1, 2022

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

示例:

输入:s = “PAYPALISHIRING”, numRows = 4
输出:”PINALSIGYAHRPI”
解释:
P I N
A L S I G
Y A H R
P I

思路如下:

/**
     * 6. Z 字形变换

     * 解法1
     * @param s
     * @param numRows
     * @return
     */
    public String convert(String s, int numRows) {
        int len = s.length();
        if(numRows==1 || numRows>=len) return s;
        //每个z周期的元素数
        int t = numRows*2-2;
        StringBuilder ans = new StringBuilder();
        //模拟Z遍历矩阵的行
        for(int i=0; i<numRows; i++){
            //找到每个周期开始的位置
            for(int j=0; i+j<len; j+=t){
                //每个周期中同一行会有两个元素出现,先找到第一个元素
                ans.append(s.charAt(i + j));
                //再找到第二个元素,第一行和最后一行只会出现一次,所以排除
                //并且考虑不超过原字符串长度
                if(0<i && i<numRows-1 && j+t-i<len){
                    ans.append(s.charAt(j + t - i));
                }
            }
        }
        return ans.toString();
    }


    //解法2: 用一维字符串数组存储每一行字符,然后拼接起来
    public String convert1(String s, int numRows) {
        if(numRows==1) return s;
        int len = s.length();
        String[] strArr = new String[numRows+1];
        for(int i=0; i<=numRows; i++){
            strArr[i]="";
        }
        int cnt = 1;
        int j = 0;
        while(j<len){
            while(cnt<=numRows && j<len){
                strArr[cnt++]+=s.charAt(j++);
            }
            cnt-=2;
            while(cnt>1 && j<len){
                strArr[cnt--]+=s.charAt(j++);
            }
        }
        String res = "";
        for(int i=1; i<=numRows; i++){
            res += strArr[i];
        }
        return res;
    }

发表评论

您的电子邮箱地址不会被公开。