• leetcode第6题:Z字形变换--直接模拟求解法


    【题目描述】
    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
    比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

    之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
    请你实现这个将字符串进行指定行数变换的函数:
    string convert(string s, int numRows);

    【解题思路】
    对于Z字形,每行使用一个StringBuiler来记录,所以得到一个数组StringBuiler[numRows];通过数组下标y,记录当前方向的up,开始模拟构造Z字型。

    【代码】

    String convert(String s, int numRows) {
        if (numRows == 1) {
            return s;
        }
    
        StringBuilder[] builders = new StringBuilder[numRows];
        for (int i = 0; i < numRows; i++) {
            builders[i] = new StringBuilder();
        }
    
        // 核心代码快
        char[] arr = s.toCharArray();
        int y = 0;
        boolean up = false;
        for (int i = 0; i < arr.length; i++) {
            builders[y].append(arr[i]);
            if (up) { // 自下向上
                y--;
                if (y == -1) {
                    y = 1;
                    up = false;
                }
            } else { // 自上向下
                y++;
                if (y == numRows) {
                    y = numRows - 2;
                    up = true;
                }
            }
        }
    
        StringBuilder result = new StringBuilder(numRows);
        for (StringBuilder b: builders) {
            result.append(b.toString());
        }
    
        return result.toString();
    }
    

    【运行结果】
    执行用时 : 6 ms, 在所有 java 提交中击败了85.36%的用户;
    内存消耗 : 39 MB, 在所有 java 提交中击败了93.94%的用户。

    【小结】
    算法的执行效率有待提高,但较易于理解。大家如有好的看法,欢迎补充。

  • 相关阅读:
    url 编码与解码
    调硬件开门
    JsBridge 开灯关灯
    滚动条样式
    uni-app 组件传值及插槽
    Eapp 调接口及跳转
    uni-app 的基础格式
    Eapp 几个弹框
    flexible 移动端适配
    mongodb恢复备份
  • 原文地址:https://www.cnblogs.com/qinvis/p/11974291.html
Copyright © 2020-2023  润新知