leetCode6. Z 字形变换(javascript)

leetCode每日一题6. Z 字形变换(javascript)

难度中等1243

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"

示例 2:

输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P     I    N
A   L S  I G
Y A   H R
P     I

示例 3:

输入:s = "A", numRows = 1
输出:"A"

提示:

  • 1 <= s.length <= 1000
  • s 由英文字母(小写和大写)、’,’ 和 ‘.’ 组成
  • 1 <= numRows <= 1000

我的解题思路:

  1. 发现数学规律,设n=numRows ,其中 n+n-2,也就是2n-2为一个最小单元;
  2. 遍历的时候,将循环进入的次数与一个最小单元的个数取余,如果i=0,n=3,则i取余4,为0,此时0为目标数组arr的下标,将对应的字符串中的第i位置单字符拼接到arr[0],i循环,以此类推;
  3. 当取余的个数大于数组的长度,则数组下标做一下调整,变为最小单元的长度减去目前取余的数值,得到的就是正确的数组下标。这块儿有点绕
  4. 最后输出

    /**
     * @param {string} s
     * @param {number} numRows
     * @return {string}
     */
    var convert = function(s, numRows) {
        let arr= new Array(numRows).fill('')
        let len=s.length;
        let n=numRows;
        if(n<2||n>len){
            return s
            }else{
        for(let i=0;i<=len-1;i++){
            if((i%(2*n-2))<=n-1){
                arr[i%(2*n-2)]=arr[i%(2*n-2)]+s.charAt(i)
            }else if(i%(2*n-2)>=n){
                arr[(2*n-2)-i%(2*n-2)]=arr[(2*n-2)-i%(2*n-2)]+s.charAt(i)
            }
    
           
        }
        return arr.join('')
        }
    
    };

其中遇到问题

  • 注意写乘法a*b,不要简写ab,会报错误认为是bigInt类型
  • 注意边界条件
  • 创建已经知道长度的数组,初始为空字符串可以使用new Array(length).fill(’’)
  • s.charAt(i) 返回字符串中,下标为i的字符
  • 数组转换位string的方法
    • arr.toString() 其中转换的字符串有,逗号 连接
    • arr.join(‘连接的字符串’)

你可能感兴趣的:(leetCode专区,javascript,leetcode)