z字形

作者: xiaohei_e853 | 来源:发表于2022-03-28 11:13 被阅读0次
class Solution {
    public String convert(String s, int numRows) {
        if (s.length() <= numRows || numRows == 1) return s;

        StringBuilder builder = new StringBuilder();
        if (numRows == 2) {
            for (int i = 0; i < s.length(); i = i + 2) {
                builder.append(s.charAt(i));
            }
            for (int i = 1; i < s.length(); i = i + 2) {
                builder.append(s.charAt(i));
            }
            return builder.toString();
        }
        //计算二维数组中横向(x轴)的长度  
        // ((字符串s的长度*2)/ (numRows*2-2))+1 该公式计算的结果可能长度会多出一个索引
        int xLen = ((s.length() << 1) / ((numRows << 1) - 2)) + 1;
        char[][] cs = new char[numRows][xLen];//用二维数组保存构建的Z字形
        //System.out.println(xLen); 计算出来二维数组中x轴的长度
        // 按列开始摆放
        int i = 0;
        for (int x = 0; x < xLen; x++) {  //二维数组x轴(横向)
            if (x % 2 == 0) {
                //二维数组y轴(纵向),保存直线上的元素   
                for (int y = 0; y < numRows && i < s.length(); y++) {
                    cs[y][x] = s.charAt(i);
                    i++;
                }
            } else {
                //二维数组y轴(纵向),保存斜线上的元素
                for (int y = numRows - 2; y >= 1 && i < s.length(); y--) {
                    cs[y][x] = s.charAt(i);
                    i++;
                }
            }
        }
//     这段代码可以打印构建出来的二维数组
//      for (int j = 0; j < cs.length; j++) {
//          System.out.println(Arrays.toString(cs[j]));
//      }
        //将二维数组还原成字符
        for (int y = 0; y < numRows; y++) {
            for (int x = 0; x < xLen; x++) {//
                if(cs[y][x]==0) continue;
                builder.append(cs[y][x]);
            }
        }
        return builder.toString();

    }


}
class Solution {
    static String convert(String s, int numRows){

        if (s.length() <= numRows || numRows == 1) return s;

        StringBuilder builder = new StringBuilder();
        if (numRows == 2) {
            for (int i = 0; i < s.length(); i = i + 2) {
                builder.append(s.charAt(i));
            }
            for (int i = 1; i < s.length(); i = i + 2) {
                builder.append(s.charAt(i));
            }
            return builder.toString();
        }

        char[] chars = s.toCharArray();
        int len = chars.length;
        int xLen = len*2/(numRows*2 -2) + 1;

        char[][] result = new char[numRows][xLen];

        int i = 0;
        for (int x = 0; x < xLen; x++) {
            if(x%2==0){
                for (int j = 0; j < numRows&&i<len; j++) {

                    result[j][x] = chars[i];
                    i++;
                }
            }else {
                for (int j = numRows-2; j >= 1&& i<len; j--) {

                    result[j][x] = chars[i];
                    i++;
                }
            }



        }

        StringBuilder stringBuilder = new StringBuilder("");

        for (int j = 0; j < numRows; j++) {
            for (int k = 0; k < xLen; k++) {
                if(result[j][k]==0){
                    continue;
                }
                stringBuilder.append(result[j][k]);
            }
        }

        return stringBuilder.toString();

    }


}

解法二,每一行定义一个stringbuilder,

class Solution {
    public String convert(String s, int numRows) {
        if(numRows == 1)
            return s;
            
        StringBuilder[] res = new StringBuilder[numRows];
        for(int i = 0; i < numRows; i++)
            res[i] = new StringBuilder();
        
        int index = 0;
        int row = 0;
        int len = s.length();
        while(index < len){
            while(index < len && row < numRows){
                char ch = s.charAt(index++);
                res[row].append(ch);
                row++;
            }
            
            if(index == len)
                break;
            
            row = numRows - 2;
            
            while(index < len && row >= 0){
                char ch = s.charAt(index++);
                res[row].append(ch);
                row--;
            }
            
            row += 2;
        }
        
        StringBuilder ans = new StringBuilder();
        for(int i = 0; i < numRows; i++)
            ans.append(res[i]);
        
        return ans.toString();
    }

}

相关文章

  • z字形

    解法二,每一行定义一个stringbuilder,

  • Z字形变换

    Z字形变换 将字符串"PAYPALISHIRING"以Z字形排列成给定的行数: P A H N A ...

  • LeetCode解题记录(6~10)

    6.Z字形变换 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: PAH NAPLSI...

  • Z字形变换

    题目描述 解题思路 解析参考自acwing,作者:adnil8130 Python代码 代码描述 第一行和最后一行...

  • Z字形变换

    题目区(源自于leetcode) 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入...

  • Z 字形变换

    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "LEETCODEIS...

  • 字音字形之Z

    字音字形之 Z 1.装载zai4 2.三年五载zai3 3.记载zai3 3.zai4载体 4.症结 zhen...

  • 《Z字形变换》

    python算法题之《Z字形变换》 题目要求 代码及分析 结果

  • Z 字形变换

    LeetCode第六题 题目描述:将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输...

  • Z字形变换

    Z 字形变换 题目: 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排...

网友评论

      本文标题:z字形

      本文链接:https://www.haomeiwen.com/subject/fhhpjrtx.html