我的js算法爬坑之旅-Z字形变换

100 阅读1分钟

第三十一天:力扣第6题,Z字形变换

地址:leetcode-cn.com/problems/zi…

思路:首先要看出来的是变换的周期是n = 2 * (numRows - 1),这个不难看出,然后每一行的规律是(j % n === i||j % n === n - i)j是序号,这样思路就清晰了。

var convert = function(s, numRows) {
  if(numRows === 1)
  {
      return s;
  }
  let res = '';
  const n = (numRows - 1) * 2;
  for(let i = 0; i < numRows; i++)
  {
    for(let j = 0; j < s.length; j++)
    {
      if(j % n === i||j % n === n - i)
      {
        res += s[j];
      }
    }
  }
  return res;
};

不过好像时间复杂度有点高

执行用时:192 ms, 在所有 JavaScript 提交中击败了11.69%的用户
内存消耗:41.6 MB, 在所有 JavaScript 提交中击败了55.91%的用户
var convert = function(s, numRows) {
    if(numRows == 1)
        return s;

    const len = Math.min(s.length, numRows);
    const rows = [];
    for(let i = 0; i< len; i++) rows[i] = "";
    let loc = 0;
    let down = false;

    for(const c of s) {
        rows[loc] += c;
        if(loc == 0 || loc == numRows - 1)
            down = !down;
        loc += down ? 1 : -1;
    }

    let ans = "";
    for(const row of rows) {
        ans += row;
    }
    return ans;
};  

这是找的其他大佬的代码,这个比较灵性,它先判断是否要向下移,再判断是否右移,获取对的值,时间复杂度确实要少点。