zoukankan      html  css  js  c++  java
  • Leetcode: ZigZag Conversion

    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 text, int nRows);
    convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".

    一道数学题,参考了网上的思路,先计算一下每一个zig包含的字符个数,实际上是zigSize = 2*nRows – 2
    然后一行一行的加s中的特定元素就行。
    第一行和最后一行都只需要加一个字符,每一个zig,而且在s中的index间隔是zigSize。
    中间每一行需要添加两个字符到结果中去。第一个字符同上;第二个字符的index就是zigSize – i。i是行index。

     需要注意的是,nRows == 1一定要单独讨论,否则rsize = 2*nRows - 2 == 0,循环没有增量会成为死循环。还有18-23行添加的顺序谁先谁后是有讲究的。

    第三遍代码:361ms

     1 public class Solution {
     2     public String convert(String s, int nRows) {
     3         if (s == null || s.length() == 0) return "";
     4         if (s.length() <= nRows || nRows == 1) return s;
     5         int rsize = 2 * nRows - 2;
     6         StringBuffer res = new StringBuffer();
     7         for (int i=0; i<nRows; i++) {
     8             if (i == 0 || i == nRows-1) {
     9                 int t = 0;
    10                 while (i + t * rsize < s.length()) {
    11                     res.append(s.charAt(i+t*rsize));
    12                     t++;
    13                 }
    14             }
    15             else {
    16                 int m = 0;
    17                 while (i + m * rsize < s.length() || (rsize - i + m * rsize) < s.length()) {
    18                     if (i + m * rsize < s.length()) {
    19                         res.append(s.charAt(i+m*rsize));
    20                     }
    21                     if ((rsize - i + m * rsize) < s.length()) {
    22                         res.append(s.charAt(rsize-i+m*rsize));
    23                     }
    24                     m++;
    25                 }
    26             }
    27         }
    28         return res.toString();
    29     }
    30 }

     如果不分开i =0, i=nRows-1和其他case, 444ms, 比上面反而慢一点

     1 public class Solution {
     2     public String convert(String s, int nRows) {
     3         if (s == null || s.length() == 0) return "";
     4         if (s.length() <= nRows || nRows == 1) return s;
     5         int rsize = 2 * nRows - 2;
     6         StringBuffer res = new StringBuffer();
     7         for (int i=0; i<nRows; i++) {
     8                 int m = 0;
     9                 while (i + m * rsize < s.length() || (rsize - i + m * rsize) < s.length()) {
    10                     if (i + m * rsize < s.length()) {
    11                         res.append(s.charAt(i+m*rsize));
    12                     }
    13                     if (i!=0 && i!=nRows-1 && ((rsize - i + m * rsize) < s.length())) {
    14                         res.append(s.charAt(rsize-i+m*rsize));
    15                     }
    16                     m++;
    17                 }
    18 
    19         }
    20         return res.toString();
    21     }
    22 }
  • 相关阅读:
    知乎 : 有什么你认为很简单的问题实际的证明却很复杂?
    民科吧 的 一题 : ∂ f / ∂ x =
    知乎: Lurie 的 derived algebraic geometry 有多重要?
    说说 网友 专业证伪 的 那道 几何题
    在 《数学问题,连接两个点的曲线旋转所成曲面中,面积最小的曲线是什么?》 里 的 讨论
    证明 夹逼定理 和 洛必达法则
    一道数学题 : 数列 { bn } 收敛, 证明 { an } 也收敛
    一道数学题 : f ( 2^x ) + f ( 3^x ) = x , 求 f ( x )
    网友 lzmsunny96 的 一个 分数 分解题
    我 搞了一个 尺规作图 不能 实现 三等分角 的 证明
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/3781136.html
Copyright © 2011-2022 走看看