问题的大意就是将字符串中的字符按锯齿状(倒N形)垂直由上向下放置,最后水平从左向右读取。比如

ABCDEFGHIJKLMN,4表示

A          G      M

B      F  H    L  N

C  E      I  K

D          J

按水平顺序读取的结果则为AGMBFHLNCEIKDJ。(原题目的描述就很有问题)


解决方案非常简单,可以发现字符串中第i个字符,其水平右边最近的元素为i+2*(row-1),其中row为规定的行高。而除了第一行和最后一行,中间的行的处理逻辑是一致的,而首行和尾行的处理逻辑也是一致的。

res = ""

step = 2 * (row - 1)

//处理首行

for(int i = 0; i < s.length; i = i + step)

  res = res + s[i]

//处理第1~row-2行

for(int i = 1; i< row - 1; i = i + 1)

  //添加处于垂直列中的元素,如果有必要还要添加中间斜线上的元素

  for(int j = i; j < s.length; j = j + step)

    res = res + s[j]

    if(j + step - i * 2 < s.length)

      res = res + s[j + step - i * 2]

//处理尾行

for(int i = row - 1; i < s.length; i = i + step)

  res = res + s[i]

由于每次循环体内的有效代码的执行都会将结果的长度增加1,但是结果的长度必定与s的长度一致,因此循环体最多只会执行s.length次,记n=s.length,因此这段代码的时间复杂度和空间复杂度均为O(n)。


最后惯例附上代码:

 package cn.dalt.leetcode;

 /**
  * Created by dalt on 2017/6/9.
  */
 public class ZigZagConversion {
     public String convert(String s, int numRows) {
         int slen = s.length();
         if (numRows == 1) {
             return s;
         }
         StringBuilder sb = new StringBuilder(slen);
         int totalstep = numRows + numRows - 2;
         //The first line
         for (int i = 0, bound = slen; i < bound; i += totalstep) {
             sb.append(s.charAt(i));
         }
         //The following line
         for (int i = 1, iBound = numRows - 1; i < iBound; i++) {
             int step = totalstep - i * 2;
             for (int j = i, jBound = slen; j < jBound; j += totalstep) {
                 sb.append(s.charAt(j));
                 if (j + step < jBound) {
                     sb.append(s.charAt(j + step));
                 }
             }
         }

         //The last line
         for (int i = numRows - 1, iBound = slen; i < iBound; i += totalstep) {
             sb.append(s.charAt(i));
         }
         return sb.toString();
     }
 }

Leetcode:ZigZag Conversion分析和实现的更多相关文章

  1. 6.[leetcode] ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  2. LeetCode ZigZag Conversion(将字符串排成z字型)

    class Solution { public: string convert(string s, int nRows) { string a=""; int len=s.leng ...

  3. LeetCode: ZigZag Conversion 解题报告

    ZigZag ConversionThe string "PAYPALISHIRING" is written in a zigzag pattern on a given num ...

  4. [leetcode]ZigZag Conversion @ Python

    原题地址:https://oj.leetcode.com/problems/zigzag-conversion/ 题意: The string "PAYPALISHIRING" i ...

  5. [LeetCode]ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  6. LeetCode——ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  7. [LeetCode] ZigZag Conversion [9]

    称号 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows li ...

  8. C++ leetcode::ZigZag Conversion

    mmp,写完没保存,又得重新写.晚上写了简历,感觉身体被掏空,大学两年半所经历的事,一张A4纸都写不满,真是一事无成呢.这操蛋的生活到底想对我这个小猫咪做什么. 今后要做一个早起的好宝宝~晚起就诅咒自 ...

  9. leetcode题解 6.ZigZag Conversion

    6.ZigZag Conversion 题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a gi ...

随机推荐

  1. [转]MFC 调用 printf 输出

    摘自:http://blog.csdn.net/miyunhong/article/details/6704121 #include <io.h> #include <fcntl.h ...

  2. linux下安装boost

    linux平台下要编译安装除gcc和gcc-c++之外,还需要两个开发库:bzip2-devel 和python-devel,因此在安装前应该先保证这两个库已经安装:#yum install gcc ...

  3. pmm监控页面502

    我们知道pmm主要使用的是 普罗米修斯采集和grafana日志统计显示. 最近为硬盘扩过一次容量,主要是docker使用的,我的pmm是跑在docker上的,但是重启后pmm的debug日志下载502 ...

  4. vi下的查找替换命令

    1.查找 查找命令 /pattern:向下查找匹配的字符 ?pattern:向上查找匹配的字符 其中pattern是需要匹配的字符串,例如: /cd #全文查找cd / cd <Enter> ...

  5. 【转】C# Socket编程(3)编码和解码

    [转自:https://www.cnblogs.com/IPrograming/archive/2012/10/13/CSharp_Socket_3.html] 在网络通信中,很多情况下:比如说QQ聊 ...

  6. [Luogu4390][BOI2007]Mokia 摩基亚

    luogu 题意 支持平面内单点加一个值以及矩阵求和. 平面大小\(W\le2*10^6\),修改操作\(\le1.6*10^5\),查询操作\(\le10^4\) sol \(CDQ\)写一发. 把 ...

  7. 用python写定时任务

    一个是sched模块,一个是threading模块 参考链接:http://www.cnblogs.com/LinTeX9527/p/6181523.html

  8. miniofs 配置使用

    1. rpm  // RPM 包下载 https://github.com/minio/minfs/releases/tag/RELEASE.2017-02-26T20-20-56Z // 安装 yu ...

  9. ZenCoding[Emmet]語法簡介【轉】

    快速指南 下面是一些常用的Zen Coding功能,目前VS2013的Web Essentials插件已经支持. '#' 创建一个id特性 '.' 创建一个类特性 '[]' 创建一个自定义特性 '&g ...

  10. VBA的过程及参数详解

    VBA的过程及参数详解 VBA中的过程(Procedure)有两种,一种叫函数(Function),另外一种叫子程序(Subroutine),分别使用Function和Sub关键字.它们都是一个可以获 ...