问题的大意就是将字符串中的字符按锯齿状(倒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. svn: E220001: 遇到不可读的路径;拒绝访问。

    在客户端试图 svn merge 总是报svn: E220001: 遇到不可读的路径:拒绝访问.这个错误 提示 : SVN 遇到不可读的路径:拒绝访问. 英文是: Unreadable path en ...

  2. 循环神经网络RNN模型和长短时记忆系统LSTM

    传统DNN或者CNN无法对时间序列上的变化进行建模,即当前的预测只跟当前的输入样本相关,无法建立在时间或者先后顺序上出现在当前样本之前或者之后的样本之间的联系.实际的很多场景中,样本出现的时间顺序非常 ...

  3. 列表(增删改查)元组tupe

    增加:有三种,append:在后面添加.Insert按照索引添加,expend:迭代着添加.#append li = ['lishi','alex','lili'] li.append(') prin ...

  4. 关于file.writelines换行符的添加

    和file.readlines/readline不同,file.writelines(l)如果l元素没有换行符,writelines是不会自动加入换行符的,需要我们自己添加,就像这样. import ...

  5. Java [Leetcode 347]Top K Frequent Elements

    题目描述: Given a non-empty array of integers, return the k most frequent elements. For example,Given [1 ...

  6. 关键的OOP概念

    OOP的好处  1.封装, 2继承, 3多态. 多态性是指相同的操作或函数.过程可作用于多种类型的对象上并获得不同的结果.不同的对象,收到同一消息将可以产生不同的结果,这种现象称为多态性. <? ...

  7. homebrew的安装与使用

    homebrew的安装:http://jingyan.baidu.com/article/fec7a1e5ec30341190b4e7e5.html 引用segfaultment上面的回答 没这个说法 ...

  8. [WPF]控件应用多个样式(转)

    最近在做WPF项目,公司没有专门的UI工程师,什么都要自己做.接触WPF已经有好几年了,自定义样式什么的也可以做一些.WPF在使用样式的时候一般都是 Style="{StaticResour ...

  9. rpm -Uvh 升级时的陷阱

    问题现象 用rpm -Uvh升级后,原先的一个软链接被删除了,而采用先rpm -e 卸载rpm包,再rpm -ivh 安装包的方法,这个软链接还在.这个软链接是在rpm包安装的时候建立,也只有在rpm ...

  10. fn project 打包Function

      Option 1 (recommended): Use the fn cli tool We recommend using the fn cli tool which will handle a ...