首页 > 算法(附思维导图 + 全部解法)300题之(6)Z字形变换
头像
码农三少
发布于 2021-08-07 16:36
+ 关注

算法(附思维导图 + 全部解法)300题之(6)Z字形变换

零 标题:算法(leetode,附思维导图 + 全部解法)300题之(6)Z字形变换

一 题目描述

题目描述
题目描述

二 解法总览(思维导图)

思维导图

三 全部解法

1 方案1

1)代码:

// 方案1:1)初始化 tempArr 等。 2)后续的下标值都由 tempArr最开始存放的几个值进行生成的
var convert = function(s, numRows) {
    let l = s.length,
        // 最顶上的几个数所组成的数组
        tempArr = [],
        // 记录已经存到 resStr 里的字符对应下标
        tempMap = new Map(),
        // 需要返回的字符串
        resStr = '';

    // 边界1:"A" 1(核心:当 numRows = 1 时)
    if (numRows === 1) {
        return s;
    }

    // 初始化 tempArr、tempMap、resStr
    for (let i = 0; true; i += 2) {
        const index = i * (numRows - 1);
        if (index < l) {
            tempArr.push(index);
            tempMap.set(index, 1);
            resStr += s[index];
        } else {
            // 边界2:"ABCD" 3(tempArr里的顶部下标多存1个,就不会漏生成一些下标了)
            tempArr.push(index);
            break;
        }
    }

    for (let bias = 1; bias < numRows; bias++) {
        for (let i = 0; i < tempArr.length; i++) {
            // 核心:根据 当前顶部的数值(tempArr[i]) 进行 +、- bias( 取值范围:[1, numRows - 1] )
            // 去分别生成新的下标 indexLeft、indexRight
            // 接着根据下标 indexLeft、indexRight 的有效情况,去进行不同的处理。
            const indexLeft = tempArr[i] - bias,
                indexRight = tempArr[i] + bias;

            // 边界3:别忘了 && indexLeft > 0 条件!!
            if (indexLeft < l && !tempMap.has(indexLeft) && indexLeft > 0) {
                tempMap.set(indexLeft, 1);
                resStr += s[indexLeft];
            }
            if (indexRight < l && !tempMap.has(indexRight)) {
                tempMap.set(indexRight, 1);
                resStr += s[indexRight];
            }
        }
    }

    return resStr;
};

2 方案2

1)代码:

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;
};

四 内推&更多

1 内推

本人是百度的1名工程师,欢迎校招、社招同学向本人投递简历。
本人可内推公司(也可帮忙内推 阿里、腾讯、字节、美团、滴滴、京东等~)的所有岗位,本人邮箱如下:

1)chenyuanbao@baidu.com

2)yuanbao.chen@qq.com

部分的JD如下:

1)内推-百度-基础架构部-前端

2)内推-百度-基础架构部-后端

2 更多

以下是个人整理的一些笔记和书籍(永久有效链接: https://pan.baidu.com/s/1SPc3umO6cZlBtoPylSaHzw 密码: eqee ,若失效的话可私信本人以进行最新资料的获取):

理财书籍pdf.png
技术书籍pdf.png

全部评论

(0) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐