zoukankan      html  css  js  c++  java
  • Leetcode 6.Z字形变换

    Z字形变换

    将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:

    P A H N

    A P L S I I G

    Y I R

    之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"

    实现一个将字符串进行指定行数变换的函数:

    string convert(string s, int numRows);

    示例 1:

    输入: s = "PAYPALISHIRING", numRows = 3

    输出: "PAHNAPLSIIGYIR"

    示例 2:

    输入: s = "PAYPALISHIRING", numRows = 4

    输出: "PINALSIGYAHRPI"

    解释:

    P I N

    A L S I G

    Y A H R

    P I

    解决方案

    方法一:按行排序

    思路

    通过从左向右迭代字符串,我们可以轻松地确定字符位于 Z 字形图案中的哪一行。

    算法

    我们可以使用个列表来表示 Z 字形图案中的非空行。

    从左到右迭代 sss,将每个字符添加到合适的行。可以使用当前行和当前方向这两个变量对合适的行进行跟踪。

    只有当我们向上移动到最上面的行或向下移动到最下面的行时,当前方向才会发生改变。

     1 class Solution {
     2     public String convert(String s, int numRows) {
     3 
     4         if (numRows == 1) return s;
     5 
     6         List<StringBuilder> rows = new ArrayList<>();
     7         for (int i = 0; i < Math.min(numRows, s.length()); i++)
     8             rows.add(new StringBuilder());
     9 
    10         int curRow = 0;
    11         boolean goingDown = false;
    12 
    13         for (char c : s.toCharArray()) {
    14             rows.get(curRow).append(c);
    15             if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
    16             curRow += goingDown ? 1 : -1;
    17         }
    18 
    19         StringBuilder ret = new StringBuilder();
    20         for (StringBuilder row : rows) ret.append(row);
    21         return ret.toString();
    22     }
    23 }

     1 class Solution {
     2     public String convert(String s, int numRows) {
     3 
     4         if (numRows == 1) return s;
     5 
     6         StringBuilder ret = new StringBuilder();
     7         int n = s.length();
     8         int cycleLen = 2 * numRows - 2;
     9 
    10         for (int i = 0; i < numRows; i++) {
    11             for (int j = 0; j + i < n; j += cycleLen) {
    12                 ret.append(s.charAt(j + i));
    13                 if (i != 0 && i != numRows - 1 && j + cycleLen - i < n)
    14                     ret.append(s.charAt(j + cycleLen - i));
    15             }
    16         }
    17         return ret.toString();
    18     }
    19 }
     

  • 相关阅读:
    ThinkPHP5如何引用新建的配置文件?
    MySQL与SQLServer的update left join语法区别
    如何POST一个JSON格式的数据给java接口,获得返回数据
    如何使用ThinkPHP5 ,自动生成目录?
    LeetCode347_TopK
    数据结构算法Review1_堆
    OJ_3_字符串数字相互转换
    C++Review11_指针数组和数组指针
    LeetCode15_三数之和
    LeetCode1_两数之和
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10162967.html
Copyright © 2011-2022 走看看