zoukankan      html  css  js  c++  java
  • 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%的用户。

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

  • 相关阅读:
    Linux C编程之十二 信号
    折腾vue--vue自定义组件(三)
    折腾vue--使用vscode创建vue项目(二)
    折腾vue--环境搭建(一)
    .net生成PDF文件的几种方式
    星星评分-依赖jquery
    组织机构树
    Newtonsoft--自定义格式化日期
    .net mvc 自定义错误页面
    js模拟form提交 导出数据
  • 原文地址:https://www.cnblogs.com/qinvis/p/11974291.html
Copyright © 2011-2022 走看看