zoukankan      html  css  js  c++  java
  • LeetCode题解No6——“Z字形变换”

    LeetCode题解

    No6

    难度:Middle

    题目描述:

    /*
    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
    
    比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
    
    L   C   I   R
    E T O E S I I G
    E   D   H   N
    之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
    
    请你实现这个将字符串进行指定行数变换的函数:
    
    string convert(string s, int numRows);
    示例 1:
    
    输入: s = "LEETCODEISHIRING", numRows = 3
    输出: "LCIRETOESIIGEDHN"
    示例 2:
    
    输入: s = "LEETCODEISHIRING", numRows = 4
    输出: "LDREOEIIECIHNTSG"
    解释:
    
    L     D     R
    E   O E   I I
    E C   I H   N
    T     S     G
    
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/zigzag-conversion
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
     */
    

    题目思路

       首先想到的是先创建有numRows长度的List,总共有numRows行的StringBuffer,按照Z字顺序将我们的字符串填入到每一行的StringBuffer中,这里采用一个boolean值来判断是否应该转换方向,转换方向的条件为:i == numRows-1 || i == 0,最后再取出元素,返回String类型的结果

    代码执行

    public class No6 {
       public static void main(String[] args) {
           String test = "LEETCODEISHIRING";
           int n = 4;
           String ans = convert(test,n);
           System.out.println(ans);
       }
       public static String convert(String s, int numRows) {
           // 按行来做
           // 特判
           if (numRows == 1) return s;
           // 先声明Math.min(s.length(),numRows)的行数 —— 如果声明numRows的行数,但numRows行数比s.length大,就会出错
           List<StringBuffer> rows = new ArrayList<>();
           for (int i = 0; i < Math.min(s.length(),numRows); i++) {
               // 初始化rows
               rows.add(new StringBuffer());
           }
    
           // 判断每次的移动
           int curRow = 0;
           boolean flag = false;
           for (int i = 0; i < s.length(); i++) {
               char cur = s.charAt(i);
               rows.get(curRow).append(cur);
               if(curRow == 0 || curRow == numRows - 1){
                   // 改变方向
                   flag = !flag;
               }
               curRow += flag?1:-1;
           }
           StringBuffer ans = new StringBuffer();
           for (StringBuffer row :
                   rows) {
               ans.append(row);
           }
           return ans.toString();
       }
    }
    

    纠错

    在思路中发现俩问题:
    1:可能String s的长度比numRows的长度小,就不用新建多余的StringBuffer了,所以此处选择Math.min(s.length(),numRows)
    2:可能出现numRows == 1的情况,所以在代码中要有一个特判

    执行结果

    String s = "LEETCODENO6" numRows = 4

  • 相关阅读:
    [整理]修改git 默认编辑器为vim
    [转]如何清空Chrome缓存和Cookie
    [整理]docker内部时区修改的两种方法
    [译]10个有关SCP的命令
    [译]在python中如何有效的比较两个无序的列表是否包含完全同样的元素(不是set)?
    通过设计表快速了解sql语句中字段的含义
    [整理]什么是排序算法的稳定性,为什么它很重要?
    pyinstaller打包自己的python程序
    [问题解决]ps aux中command命令相同,如何找出自己要的进程号?
    [常识]Windows系统里休眠和睡眠的区别?
  • 原文地址:https://www.cnblogs.com/mlz031702145/p/13646344.html
Copyright © 2011-2022 走看看