• 0006. ZigZag Conversion (M)


    ZigZag Conversion (M)

    题目

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

    P   A   H   N
    A P L S I I G
    Y   I   R
    

    And then read line by line: "PAHNAPLSIIGYIR"

    Write the code that will take a string and make this conversion given a number of rows:

    string convert(string s, int numRows);
    

    Example 1:

    Input: s = "PAYPALISHIRING", numRows = 3
    Output: "PAHNAPLSIIGYIR"
    

    Example 2:

    Input: s = "PAYPALISHIRING", numRows = 4
    Output: "PINALSIGYAHRPI"
    
    Explanation:
    
    P     I      N
    A   L S    I G
    Y A   H  R
    P     I
    

    题意

    给定字符串,将其按照指定行数进行之字形的重新排列,按顺序输出新图形的每一行字符。

    思路

    直接模拟字符重排的过程,按顺序将每一个字符存入对应行号的字符串中,注意在第一行和最后一行处要改变行号变化的方向。


    代码实现

    Java

    class Solution {
        public String convert(String s, int numRows) {
            // 特殊情况直接返回字符串
            if (numRows == 1) {
                return s;
            }
            
            // 分别保存重排后的每一行
            List<StringBuilder> sbs = new ArrayList<>();
            for (int i = 0; i < numRows; i++) {
                sbs.add(new StringBuilder());
            }
            
            // row指定当前字符对应的行号
            int row = 0;
            // flag用于判断行号增减方向
            boolean flag = false;
            // 按顺序将字符保存到对应的行字符串中
            for (char c : s.toCharArray()) {
                sbs.get(row).append(c);
                // 在第一行和最后一行要变换行号增减方向
                if (row == 0 || row == numRows - 1) {
                    flag = !flag;
                }
                if (flag) {
                    row++;
                } else {
                    row--;
                }
            }
            
            StringBuilder res = new StringBuilder();
            for (StringBuilder sb : sbs) {
                res.append(sb);
            }
            return res.toString();
        }
    }
    

    JavaScript

    /**
     * @param {string} s
     * @param {number} numRows
     * @return {string}
     */
    var convert = function (s, numRows) {
      if (numRows === 1) {
        return s
      }
    
      let rows = []
      for (let i = 0; i < numRows; i++) {
        rows[i] = []
      }
      let line = 0
      let flag = false
      for (let c of s) {
        rows[line].push(c)
        if (line === 0 || line === numRows - 1) {
          flag = !flag
        }
        line += flag ? 1 : -1
      }
      return rows.map((chars) => chars.join('')).join('')
    }
    
  • 相关阅读:
    Java Web 网络留言板2 JDBC数据源 (连接池技术)
    Java Web 网络留言板3 CommonsDbUtils
    Java Web ConnectionPool (连接池技术)
    Java Web 网络留言板
    Java Web JDBC数据源
    Java Web CommonsUtils (数据库连接方法)
    Servlet 起源
    Hibernate EntityManager
    Hibernate Annotation (Hibernate 注解)
    wpf控件设计时支持(1)
  • 原文地址:https://www.cnblogs.com/mapoos/p/13130252.html
Copyright © 2020-2023  润新知