Z 字形变换

内容目录

6.Z 字形变换

problem

题目分析

题目起初看起来可能有些难以理解,所谓的 z 字形变换是一个倒过来的 Z ,看起来是这样的:|/|/|/|

第一想法是使用 n 个字符串来分别存储每一行的字符,最后将这 n 个字符串连接在一起输出即可。
那么首先让我们先观察一下这个 Z 字形排列,假如行数为 4,那么在实际排列的时候,从第一个字母开始存储顺序为:
str[0]–>str[1]–>str[2]–>str[3]–>str[2]–>str[1]–str[0]–>str[1]–>str[2]–>str[3]–>str[2]…

在这个顺序中被加粗的是 Z 字形拐角的位置。所以我们只需要得到 0,1,2,3,2,1,0 这样的数字序列,就可以将每个字符放在应该放入的字符串中了。

首先得到输入数组的长度 len,与划分的行数 n。然后遍历整个字符串。

/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function (s, numRows) {
  let len = s.length;
  numRows = numRows - 1;
  let str = [];

  if (numRows === 0) return s;

  for (let i = 0; i < numRows + 1; i++) {
    str[i] = s[i];
  }

  for (let i = numRows + 1, j = -(numRows - 1); i < len; i++, j++) {
    str[j > 0 ? j : -j] += s[i];
    if (j % numRows === 0) {
      j = -j;
    }
  }

  for (let a of str) {
    console.log(a);
  }

  return str.join("");
};

上述代码中,我们使用了一个数组来存储每一行的字符串,然后遍历整个字符串,将每个字符放入对应的字符串中。 是对于我看到题目的第一想法的实现,最终通过判题之后,效率并不高。

更好的代码实现可以参考 leetcode 官方题解

相关笔记

盛最多水的容器

11. 盛最多水的容器 题目分析 刚开始接触到这个题目的时候可能会想着只要将所有情况遍历一遍,先是 i 为左桶沿的所有情况,然后 i+1 ,i+2… 但是这种做法显然不是最优解。不如我们换一种遍历的想法。

阅读全文

双指针法

双指针法 双指针法是一种常见的技巧,它的思想是使用两个指针分别指向数组的头部和尾部,然后向中间移动,直到两个指针相遇。 指针移动的条件根据具体的需求而定。 双指针法可以用于解决一些常见的问题,如:查找数组中是否存在某个元素、查找数组中两个数的和等于某个值、查找数组中最长的连续子数组等。 双指针法的时间复杂度通常为 O(n),其中 n 是数组的长度。 题目 盛最多水的容器

阅读全文

广度优先搜索

简介 广度优先搜索(Breadth First Search)简称广搜或者 BFS. 广度优先搜索,感官上就像是水波的涟漪,从一个点开始,向外扩散,直到扩散到所有的点为止。下面这个例子 forked from areaxe,可以很好的解释广度优先搜索的过程。

阅读全文