ARTS 打卡 第四周,游刃有余

news2025/1/10 10:18:02

引言

时间过得好快,已经到了第四周学习打卡环节,也是本次活动的最后一周。认识三掌柜的想必都知道,我持续创作技术博客已经有6年时间了,固定每个月发布不少于6篇博文。同时,自己作为一名热爱分享的开发者,像ARTS这样的活动自然少不了我。由于我是打算挤在一起分享,之前都是做了本地文档记录,所以直接把内容整合起来即可,那么接下来就开启我的第四周打卡咯。

Algorithm

本周我想分享一个比较经典的算法问题,该算法题也是力扣(Leetcode-449 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)的经典算法题目:序列化和反序列化二叉搜索树问题。

序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。

设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。

编码的字符串应尽可能紧凑。

思路:给定一棵二叉树的「先序遍历」和「中序遍历」可以恢复这颗二叉树。给定一棵二叉树的「后序遍历」和「中序遍历」也可以恢复这颗二叉树。而对于二叉搜索树,给定「先序遍历」或者「后序遍历」,对其经过排序即可得到「中序遍历」。因此,仅对二叉搜索树做「先序遍历」或者「后序遍历」,即可达到序列化和反序列化的要求。此题解采用「后序遍历」的方法。

序列化时,只需要对二叉搜索树进行后序遍历,再将数组编码成字符串即可。

反序列化时,需要先将字符串解码成后序遍历的数组。在将后序遍历的数组恢复成二叉搜索树时,不需要先排序得到中序遍历的数组再根据中序和后序遍历的数组来恢复二叉树,而可以根据有序性直接由后序遍历的数组恢复二叉搜索树。后序遍历得到的数组中,根结点的值位于数组末尾,左子树的节点均小于根节点的值,右子树的节点均大于根节点的值,可以根据这些性质设计递归函数恢复二叉搜索树。

具体的JS实现代码如下所示:

var serialize = function(root) {
    const list = [];

    const postOrder = (root, list) => {
        if (!root) {
            return;
        }
        postOrder(root.left, list);
        postOrder(root.right, list);
        list.push(root.val);
    }

    postOrder(root, list);
    const str = list.join(',');
    return str;
};

var deserialize = function(data) {
    if (data.length === 0) {
        return null;
    }
    let arr = data.split(',');
    const length = arr.length;
    const stack = [];
    for (let i = 0; i < length; i++) {
        stack.push(parseInt(arr[i]));
    }

    const construct = (lower, upper, stack) => {
        if (stack.length === 0 || stack[stack.length - 1] < lower || stack[stack.length - 1] > upper) {
            return null;
        }
        const val = stack.pop();
        const root = new TreeNode(val);
        root.right = construct(val, upper, stack);
        root.left = construct(lower, val, stack);
        return root;
    }

    return construct(-Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, stack);
};

复杂度分析:

时间复杂度:O(n)O(n)O(n),其中 nnn 是树的节点数。serialize\textit{serialize}serialize 需要 O(n)O(n)O(n) 时间遍历每个点。deserialize\textit{deserialize}deserialize 需要 O(n)O(n)O(n) 时间恢复每个点。

空间复杂度:O(n)O(n)O(n),其中 nnn 是树的节点数。serialize\textit{serialize}serialize 需要 O(n)O(n)O(n) 空间用数组保存每个点的值,递归的深度最深也为 O(n)O(n)O(n)。deserialize\textit{deserialize}deserialize 需要 O(n)O(n)O(n) 空间用数组保存每个点的值,递归的深度最深也为 O(n)O(n)O(n)。

Review

本周分享一个自己在学习区块链的英文文章,文章是关于比特币的实际运作方式,文章链接How the Bitcoin protocol actually works – DDI ,这篇文章从这里开始就进入更多的技术视角,了解比特币的一些技术细节,但仍然是在整体上了解比特币协议框架,熟悉以比特币为代表的区块链项目的技术范式。

下面摘抄部分内容做分享:

A problem with the first version of Infocoin is that Alice could keep sending Bob the same signed message over and over. Suppose Bob receives ten copies of the signed message “I, Alice, am giving Bob one infocoin”. Does that mean Alice sent Bob ten different infocoins? Was her message accidentally duplicated? Perhaps she was trying to trick Bob into believing that she had given him ten different infocoins, when the message only proves to the world that she intends to transfer one infocoin.

What we’d like is a way of making infocoins unique. They need a label or serial number. Alice would sign the message “I, Alice, am giving Bob one infocoin, with serial number 8740348”. Then, later, Alice could sign the message “I, Alice, am giving Bob one infocoin, with serial number 8770431”, and Bob (and everyone else) would know that a different infocoin was being transferred.

Infocoin的第一个版本的一个问题是,Alice可能会不断地向Bob发送相同的签名消息。假设Bob收到十份签名信息“我,Alice,给Bob一个信息币”。这是不是意味着爱丽丝给鲍勃发了十个不同的信息币?她的信息是不是被意外复制了?也许她是想欺骗鲍勃,让他相信她给了他十个不同的信息币,而这条信息只向世界证明了她打算转移一个信息币。

我们想要的是一种使信息币独一无二的方式。他们需要一个标签或序列号。爱丽丝会在信息上签名:“我,爱丽丝,给鲍勃一个序列号为8740348的信息币”。然后,爱丽丝可以在消息上签名“我,爱丽丝,给鲍勃一个序列号为8770431的信息币”,鲍勃(和其他人)就会知道另一个信息币正在被转移。

Technique/Tips

这次分享一个关于前端开发中的重要知识点,在前端开发过程中涉及到算法相关的知识,贪心算法的相关知识点使用。这里以买卖股票的最佳时机的前端开发中的实用场景进行分享,这不是一个算法题哦,这确确实实是在前端开发中能够用到的知识点,具体实现代码如下所示:

/**
 
* @param {number[]} p 价格
 
* @return {number} r 最优解
 
*/
 
var maxOptimal = function(p) {
 
    var r = 0;
 
    for(var i=1;i<=p.length;i++){
 
        if(p[i]>p[i-1]){
 
            r = p[i] - p[i-1] + r;
 
        }
 
    }
 
    return r;
 
};

Share

本次分享一下关于程序员是否需要考证的话题。对于这个话题,不同人有不同的看法,有人认为程序员只需要具备扎实的编程基础,丰富的项目经验和不断学习的态度,就可以胜任工作;而有些人则认为,程序员需要考取专业证书,这样才能证明自己拥有一定的专业技能和能力,也能够获得更好的工作机会和薪资待遇,提高自身的竞争优势。

在实际情况中,在大多数公司中,程序员的职业发展需要考虑到多方面的因素,如专业知识、技能水平、项目经验等。考证无疑是衡量一个程序员专业程度的一种方式,但并不是唯一的方式。如果一个程序员拥有丰富的项目经验、优秀的编程能力和对新技术的不断学习,也可以得到公司的认可和职业进阶的机会。

所以,个人认为程序员可以去考证,但是不是非必须的选择,一切还是以自身的实际情况决定的。

结束语

写到这里,第四周是游刃有余,已经完全适应了ARTS 打卡学习模式,总体来讲用一周的业余时间来分别研究这4件事情,总体来说每天花一些时间来分别研究这几件事情,然后一周的周末来一个总结,这样的方式也是相当不错的。截止到第四周,参与打卡的ARTS学习月就告一段落,但是自己不会跟着活动结束而结束,我会继续以这种方式来每周提升自己一点点,保持持续学习的状态,让自己在潜移默化中不断进步成长!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1053774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jmh的OperationsPerInvocation参数

背景 最近再看fllink的性能基准测试时&#xff0c;发现它使用了OperationsPerInvocation注解&#xff0c;本文就来记录下这个注解的含义 官方解释 从官方文档&#xff1a;http://javadox.com/org.openjdk.jmh/jmh-core/0.9/org/openjdk/jmh/annotations/OperationsPerInvoca…

1.4.C++项目:仿muduo库实现并发服务器之buffer模块的设计

项目完整版在&#xff1a; 一、buffer模块&#xff1a; 缓冲区模块 Buffer模块是一个缓冲区模块&#xff0c;用于实现通信中用户态的接收缓冲区和发送缓冲区功能。 二、提供的功能 存储数据&#xff0c;取出数据 三、实现思想 1.实现换出去得有一块内存空间&#xff0c;采…

预编译(3)

目录 命名约定&#xff1a; #undef 命令行定义 条件编译 常见的条件编译指令 头⽂件的包含 头⽂件被包含的⽅式&#xff1a; 本地⽂件包含 库⽂件包含 嵌套文件包含 命名约定&#xff1a; 一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者那我们平…

代码随想录-哈希表|ACM模式

目录 前言&#xff1a; &#xff08;1&#xff09;基本概念 &#xff08;2&#xff09;常见的三种哈希结构 242.有效字母的异位词 题目描述&#xff1a; 输入输出描述&#xff1a; 思路和想法: 349. 两个数组的交集 题目描述&#xff1a; 输入输出描述&#xff1a; …

Mac上如何修复损坏的音频?试试iZotope RX 10,对音频进行处理,提高音频质量!

iZotope RX 10是一款由iZotope公司开发的音频修复和编辑软件。它被广泛用于电影、电视、音乐和游戏等行业的音频后期制作&#xff0c;以及声音设计和修复工作。 在RX 10中&#xff0c;iZotope从头开始重新设计了全新的Repair Assistant修复助手&#xff0c;并且推出了相应的修…

嵌入式学习笔记(40)看门狗定时器

7.5.1什么是看门狗、有何用 (1)看门狗定时器和普通定时器并无本质区别。定时器可以设定一个时间&#xff0c;在这个时间完成之前定时器不断计时&#xff0c;时间到的时候定时器会复位CPU&#xff08;重启系统&#xff09;。 (2)系统正常工作的时候当然不希望被重启&#xff0…

【小沐学前端】Node.js实现基于Protobuf协议的UDP通信(protobuf.js)

文章目录 1、简介1.1 node1.2 Protobuf 2、下载和安装2.1 node2.2 Protobuf2.2.1 安装2.2.2 工具 3、node 代码示例3.1 HTTP3.2 UDP单播3.4 UDP广播 4、Protobuf 代码示例4.1 例子: awesome.proto4.1.1 加载.proto文件方式4.1.2 加载.json文件方式4.1.3 加载.js文件方式 4.2 例…

vSAN7.0更换硬盘步骤

更换容量盘 预先检查 查看故障硬盘 清单->集群->监控->vsan->skyline运行->物理磁盘->运维运行状况 检查数据同步状态 清单->集群->监控->vsan->重新同步对象&#xff0c;数值全为0表示未重建。 数据迁移检查 清单->集群->监控->…

推荐算法——Apriori算法原理

0、前言&#xff1a; 首先名字别读错&#xff1a;an pu ruo ao rui 【拼音发音】Apriori是一种推荐算法推荐系统&#xff1a;从海量数据中&#xff0c;帮助用户进行信息的过滤和选择。主要推荐方法有&#xff1a;基于内容的推荐、协同过滤推荐、基于关联规则的推荐、基于知识的…

八大排序源码(含优化)

文章目录 1、直接插入排序2、希尔排序3、选择排序4、冒泡排序5、堆排序6、快速排序快速排序递归实现霍尔法挖坑法前后指针法快速排序小区间优化 快速排序非递归实现 7、归并排序归并排序递归实现归并排序非递归 8、计数排序 大家好&#xff0c;我是纪宁&#xff0c;这篇文章是关…

36.骑士周游算法及其基于贪心算法的优化

概述 骑士周游算法&#xff0c;叫做“马踏棋盘算法”或许更加直观。在国际象棋8x8的棋盘中&#xff0c;马也是走“日字”进行移动&#xff0c;相应的产生了一个问题&#xff1a;“如果要求马 在每个方格只能进入一次&#xff0c;走遍全部的64个方格需要如何行进&#xff1f;”…

【STM32基础 CubeMX】按键的检测

文章目录 前言一、按键原理图分析二、cubeMX配置key GPIO三、代码分析3.1 cubemx生成的代码3.2 1个库函数 四、按键点灯示例代码总结 前言 在嵌入式系统开发中&#xff0c;按键检测是一个基础而重要的任务&#xff0c;特别是在使用STM32系列微控制器的项目中。按键通常被用于与…

C++ - 开放地址法的哈希介绍 - 哈希表的仿函数例子

前言 哈希其实是一种搜索方式&#xff0c;像暴力查找&#xff0c;有序数组的二分查找&#xff0c;二分查找就很快了&#xff0c;可以达到O(log n)。但是有序数组有一个 弊端&#xff0c;就是要先进行排序&#xff0c;这就有消耗&#xff0c;这还好&#xff0c;当要插入删除修改…

Go-Python-Java-C-LeetCode高分解法-第八周合集

前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接&#xff1a;LeetCode-Go-Python-Java-C 欢迎订阅CSDN专栏&#xff0c;每日一题&#xff0c;和博主一起进步 LeetCode专栏 本文部分内容来自网上搜集与个人实践。如果任何信息存在错误,欢迎…

UE5.1编辑器拓展【一、脚本化资产行为,通知,弹窗,高效复制多个同样的资产】

目录​​​​​​​ 插件制作 添加新的类&#xff1a;AssetActionUtility 添加新的模块&#xff1a;EditorScriptingUtilities 路径了解 添加debug的头文件 代码【debug.h】内涵注释&#xff1a; 写函数 .h文件 .cpp文件 插件制作 首先第一步是做一个插件&#xff1a…

Flink中序列化RoaringBitmap不同方式的对比

背景 在flink中&#xff0c;我们有时候会使用到RoaringBitmap进行统计计数等操作&#xff0c;而当使用RoaringBitmap时&#xff0c;这就涉及到了最重要的问题&#xff0c;如何序列化&#xff1f;序列化的目的是为了进行网络通信或者状态序列化的目的&#xff0c;本文的重点是比…

根据GWAS数据估算样本量N和使用千人基因组填充maf的参考文献

https://github.com/GenomicSEM/GenomicSEM/wiki/2.1-Calculating-Sum-of-Effective-Sample-Size-and-Preparing-GWAS-Summary-Statistics

【LeetCode热题100】--104.二叉树的最大深度

104.二叉树的最大深度 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) …

尚硅谷谷粒商城部分报错问题处理

1、启动报错&#xff1a; 内容&#xff1a; org.springframework.beans.factory.BeanCreationException: Error creating bean with name attrAttrgroupRelationController: Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed t…

使用prometheus监控java服务

在prometheus官方下载页面没有看到jvm_exproter的下载地址但是官方页面是有推荐下载地址的 访问 Prometheus - Monitoring system & time series database prometheus官方网址 官方推荐地址下载是在github网络访问不方便的可以用下面的网址 wget https://repo1.maven…