Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >手撕代码系列(三)

手撕代码系列(三)

作者头像
Immerse
发布于 2024-03-13 07:04:13
发布于 2024-03-13 07:04:13
11500
代码可运行
举报
文章被收录于专栏:沉浸式趣谈沉浸式趣谈
运行总次数:0
代码可运行

手撕代码系列(三)

手写匹配括号 isValid

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 匹配括号 isValid
 * @param {String} symbolStr 符号字符串
 * @return {Boolean}
 *
 * @logic
 * 1.定义一个栈数组(stack)
 * 2.定义字典(obj)
 * 3.遍历字符串
 * 4.判断字符串中的每个字符与其对应的符号是否出现在字典(obj)中(如果是有效的,前者与后者是相对应的)
 * 5.最后判断,如果栈数组(stack)的长度为 0, 则证明是有效的。
 */
const isValid = symbolStr => {
    let stack = [];
    let obj = {
        '(': ')',
        '[': ']',
        '{': '}',
    };
    for (let i = 0; i < symbolStr.length; i++) {
        let ele = symbolStr[i];
        // Object.prototype.hasOwnProperty.call(obj, ele):方法是一个常用的,安全检测对象是否含有某个属性的方法,使用此方法可避免 hasOwnProperty 属性被污染或被重写的风险。
        if (Object.prototype.hasOwnProperty.call(obj, ele)) {
            stack.push(ele);
        } else {
            if (ele != obj[stack.pop()]) return false;
        }
    }
    return !stack.length;
};


// test:
console.log("isValid('(){}') ------>", isValid('(){'));
// isValid('(){}') ------> true
// isValid('(){') ------> false

手写大驼峰转下划线 camelCasetoLineCase

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 大驼峰转下换线 camelCasetoLineCase
 * @param {String} str 字符串
 * @return 下划线格式字符串
 */
const camelCasetoLineCase = str => {
    // /([A-Z])/g: 全局匹配大写字母 A-Z
    // $1: 对应正则捕获到的内容。详细可看下方 demo
    // _$1: 将捕获的内容采用下换线的形式并改成小写格式
    return str.replace(/([A-Z])/g, '_$1').toLowerCase();
};

// test:
console.log("camelCasetoLineCase('helloWorld') ------>", camelCasetoLineCase('helloWorld')); // camelCasetoLineCase('helloWorld') ------> hello_world

// $1 Demo:
var str = 'Doe, John';
// 说明:$1,$2上就是按顺序对应小括号里面的小正则 捕获到的内容
// 把 "Doe, John" 转换为 "John Doe" 的形式
let res = str.replace(/(\w+)\s*, \s*(\w+)/, '$2 $1');
console.log('res ------>', res); // res ------> John Doe

手写下划线转大驼峰 lineCasetocamelCase

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 下划线转大驼峰 lineCasetocamelCase
 * @param {String} str 需要转换的字符串
 * @return camelCase 格式字符串
 */
const lineCasetocamelCase = str => {
    // \_:将下一个字符标记捕获到的字符。例如:\n 匹配换行符,\\ 匹配 \,\( 匹配 (
    // \w: 全局匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
    return str.replace(/\_(\w)/g, (sourceLetter, letter) => {
        console.log('sourceLetter ------>', sourceLetter, letter); // _w, w
        return letter.toUpperCase();
    });
};

// test:
console.log("linetoHump('hello_world') ------>", linetoHump('hello_world')); // linetoHump('hello_world') ------> helloWorld

手写反转字符串 reverseStr

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 反转字符串 reverseStr
 * @param {String} str 需要反转的字符串
 * @return 反转后的字符串
 */
const reverseStr = str => {
    let strArr = str.split('');
    let left = 0;
    let right = strArr.length;
    while (left <= right) {
        [strArr[left], strArr[right]] = [strArr[right], strArr[left]];
        left++;
        right--;
    }
    return strArr.join('');
};

// test:
console.log("reverseStr('helloworld') ------>", reverseStr('helloworld')); // reverseStr('helloworld') ------> dlrowolleh

深度优先遍历 DFS(Depth First Search)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 深度优先搜索: DFS(Depth First Search)
 *      深度优先搜索:也就是一条路走到黑,然后再往回走,看看是否还有其他路径
 *      分类:二叉树的前、中、后序遍历
 *          前序遍历:根节点 -> 左子树 -> 右子树
 *          中序遍历:左子树 -> 根节点 -> 右子树
 *          后序遍历:左子树 -> 右子树 -> 根节点
 */
class Node {
    constructor(val) {
        this.key = val;
        this.left = null;
        this.right = null;
    }
}
let root = null;
let arr = [];

// 前序遍历:根节点 -> 左节点 -> 右节点
const preOrder = node => {
    if (node === null) return;
    arr.push(node.key);
    preOrder(node.left);
    preOrder(node.right);
    return arr;
};

// 中序遍历:左节点 -> 根节点 -> 右节点
const inOrder = node => {
    if (node === null) return;
    inOrder(node.left);
    arr.push(node.key);
    inOrder(node.right);
    return arr;
};

// 后续遍历:左节点 -> 右节点 -> 根节点
const postOrder = node => {
    if (node === null) return;
    postOrder(node.left);
    postOrder(node.right);
    arr.push(node.key);
    return arr;
};


// test:
root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.right.right = new Node(6);
root.left.left = new Node(4);
root.left.right = new Node(5);
/**
 *  Binary Tree:
          1
       2    3
     4    5   6
 */

// console.log(preOrder(root)); // [ 1, 2, 4, 5, 3, 6 ]
// console.log(inOrder(root)); // [ 4, 2, 5, 1, 3, 6 ]
// console.log(postOrder(root)); // [ 4, 5, 2, 6, 3, 1 ]

特殊字符描述

•问题标注 Q:(question)

•答案标注 R:(result)

•注意事项标准:A:(attention matters)

•详情描述标注:D:(detail info)

•总结标注:S:(summary)

•分析标注:Ana:(analysis)

•提示标注:T:(tips)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 非同质前端札记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——12.二叉树(习题)
hope kc
2024/09/23
1050
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——12.二叉树(习题)
【OJ】二叉树的遍历
这里考察二叉树的前序遍历,遍历用递归就可以了,但是这里题目要求给的是遍历返回的是二叉树对应值前序遍历的结果,还要求按数组输出。 returnSize这里是用来记录节点的个数,不是数组。
zxctscl
2024/03/12
980
【OJ】二叉树的遍历
【初阶数据结构篇】深入浅出:链式结构二叉树(二叉链)的实现与递归奥秘(上篇)
BinaryTree · petrichor/2024-summer-c-language - 码云 - 开源中国 (gitee.com)
半截诗
2024/10/09
1600
【初阶数据结构篇】深入浅出:链式结构二叉树(二叉链)的实现与递归奥秘(上篇)
七十六、 数据结构二叉树及其代码实现
树是一种非常重要的非线性结构,本身具有递归的性质(在其后的编程中体现的淋漓尽致)。
润森
2022/08/17
4440
七十六、 数据结构二叉树及其代码实现
二叉树遍历
这3种遍历都属于递归遍历,或者说深度优先遍历(Depth-First Search,DFS),因为它总 是优先往深处访问。
河马嘴不大
2022/12/24
3440
【数据结构与算法】详解什么是树结构,并用代码手动实现一个二叉查找树
本系列文章【数据结构与算法】所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接
@零一
2021/01/29
7150
C++穿梭树影间的智慧博弈:二叉搜索树OJ
观察示例可以知道,无论是左为空还是左为不为空,都要添加括号,所以直接递归下去,右分支则可以根据情况省略括号
DARLING Zero two
2025/04/26
940
C++穿梭树影间的智慧博弈:二叉搜索树OJ
二叉搜索树在线OJ题讲解
我们首先进行题目的解读: 大概意思就是用()把每个节点的值给括起来,然后再经过一系列的省略的来得到最后的结果
ahao
2024/03/19
1000
二叉搜索树在线OJ题讲解
导师计划--数据结构和算法系列(上)
导师计划已经开始一个月了,自己的讲解的课程选择了数据结构和算法。这个系列的讲解分为上下两章,javascript语言辅助。本篇文章为上章,涉及的内容是基本的数据结构。在日本,晚上没事安排@…@,时间还是充足的...,于是自己整理下本系列知识点的上章内容。
Jimmy_is_jimmy
2023/09/01
2160
导师计划--数据结构和算法系列(上)
C++: 二叉树进阶面试题
根据前序遍历创建二叉树, 再递归子树之前需要加括号, 但是题目要求省略不必要的括号, 通过观察可发现
用户11317877
2024/10/16
860
C++: 二叉树进阶面试题
Data Structures and Algorithms Basics(009):Tree
5,Postorder traversal method, iteratively
用户5473628
2019/08/08
4970
【数据结构】二叉搜索树BSTree
(注意:不能插入重复的元素,并且每次插入都是要定位到空节点的位置;我们先定义一个 cur从root开始,比较元素的大小:若插入的元素比当前位置元素小就往左走,比当前位置元素大就往右走,直到为空,相等就不能插入了;同时定义一个parent去记录当前 cur的前一个位置,最后判断cur是parent的左子树还是右子树即可)
平凡的人1
2023/10/15
2720
【数据结构】二叉搜索树BSTree
原 数据结构-二叉搜索树(Binary S
    笔者最近开始学习了二叉树这种数据结构,于是写出了一个二叉树的实现~     二叉树真是个好东西 =。=     该图显示了在二叉树中插入一个节点的步骤...下面就用这个二叉树做测试好了 /** "BST.h"  * The Binary Search Tree Data Structure in C++  * Time Cost : Inorder / Preorder / Postorder Traversal : O(n)  *             Search / Find / In
不高不富不帅的陈政_
2018/05/18
6860
【C++】二叉搜索树
二叉搜索树又称二叉排序树,可以简写成 BST,它或者是一棵空树,或者是具有以下性质的二叉树:
YoungMLet
2024/03/01
1670
【C++】二叉搜索树
C++【二叉树进阶试题】
这是一篇关于 二叉树 题解博客,主要包含以下题目,可根据当前文章中的目录随意跳转查看
北 海
2023/07/01
2930
C++【二叉树进阶试题】
【Java数据结构】二叉树详解(四)
E绵绵
2025/05/24
1050
【Java数据结构】二叉树详解(四)
二叉树经典OJ题(2)
技巧:在递归过程中,我们想要有一个变量记录全过程(该题中的prev),第一种方法就是设置成全局变量,第二种方法就是传引用。
小陈在拼命
2024/04/20
840
二叉树经典OJ题(2)
【愚公系列】2023年11月 数据结构(八)-二叉树
数据结构是计算机科学中的一个重要概念,它描述了数据之间的组织方式和关系,以及对这些数据的访问和操作。常见的数据结构有:数组、链表、栈、队列、哈希表、树、堆和图。
愚公搬代码
2023/11/07
3610
用Js怒刷LeetCode
针对有一定数据结构基础(了解链表, 二叉树, 二叉堆, 递归)的基本概念,并对时间空间复杂度有基本认知的。
hellocoder2028
2022/10/27
2.3K0
二叉树oj以及前中后序非递归写法
给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。
始终学不会
2023/10/17
2390
二叉树oj以及前中后序非递归写法
相关推荐
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——12.二叉树(习题)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档