二叉树的序列化和反序列化
1 题目
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1
/ \ 2 3 / \ 4 5
序列化为 “[1,2,3,null,null,4,5]”提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。
作者:力扣 (LeetCode)链接:https://leetcode-cn.com/leetbook/read/20 ...
剑指 Offer 19. 正则表达式匹配
1 题目
请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但与”aa.a”和”ab*a”均不匹配。
示例 1:
输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:
输入:s = “aa”p = “a*”输出: true解释: 因为 ‘*’ 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 ‘a’。因此,字符串 “aa” 可被视为 ‘a’ 重复了一次。示例 3:
输入:s = “ab”p = “.“输出: true解释: “.“ 表示可匹配零个或多个(’*’)任意字符(’.’)。示例 4:
输入:s = “aab”p = “cab”输出: true解释: 因为 ‘*’ 表示零个或多个,这里 ‘c’ 为 0 个, ‘a’ 被重复一次。因此可以 ...
什么是幂等性
1、概述幂等性原本是数学上的概念,即使公式:$f(x)=f(f(x))$ 能够成立的数学性质。用在编程领域,则意为对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的。
幂等性是分布式系统设计中十分重要的概念,具有这一性质的接口在设计时总是秉持这样的一种理念:调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。
幂等有两个维度:一是空间维度上的幂等,即幂等对象的范围,是个人还是机构,是某一次交易还是某种类型的交易…二是时间维度上的幂等,即幂等的保证时间,是几秒、几分钟还是永久性的…
不同的需求,会有不一样的解决方案,难度和成本也不一样。
2、幂等性适用领域试想这样的一种场景:在电商平台上支付后,因为网络原因导致系统提示你支付失败,于是你又重新付款了一次,等完成后检查网银发现被系统扣了两次款,这是一种什么样的体验?
造成上述问题的原因可能有很多,比如第一次付款时实际支付成功,但是信息返回时网络中断导致系统误判;又比如第一次付款的确失败了,但第二次付款时发生意外,导致支付请求被重复发送等等。在一次支付的过程中,每个 ...
next permutation 下一个全排列
1 31. 下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/next-permutation著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2 解释思路从后往前遍历数组,找到第一个小于当前索引位置的数,假设当前索引是$i$,则找到$i-1$,有以下三种情况:
$i==nums.length$,说明数组是一个升序数组,直接交换$nums[i]$和$nums[i-1]$的位置即可,如$123$->$132$
$0<i<nums.length$,说明这样的数在数组中间,直接从第$[i…nums.length]$的数中找到一个大于且仅大 ...
java消息队列的作用
消息队列的使用场景:异步、削峰(负载均衡)、解耦。
1 异步(提升系统相应速度)场景一:当电商购物的过程中,需要付款,那么付款就是一个简单的流程,假如说需要花费$100ms$。由于现在都是基于微服务开发的应用,那么每添加一个新的功能,就相应会多一个新的微服务系统,各个微服务系统之间的通信协作就会花费较多时间。那么当后期需要添加新功能时,可能会添加**优惠券系统($100ms$)、积分系统($100ms$)**等。可能一次付款成功的操作会有十几个相应的非主流业务也要执行,如果使用同步的方式那么会消耗很长的时间,所以这个时候使用消息中间件来进行异步执行各个非主流的业务。这样整个下单过程就会值消耗$100ms$的时间,而所有的非主流业务都执行了。
2 削峰(负载均衡,抵抗请求高峰时期)假如某个服务器只能承受5000的访问量,那么当此时有8000的访问量时,那么当前的服务器一定会宕机,如果使用消息中间件,将所有的请求流量添加到消息中间件中,此时由服务器去消息中间件中取请求的事件,此时服务器可以根据当前的总请求数进行协调与均衡,不至于让服务器宕机。比如淘宝双十一凌晨12点时,此时流量会瞬间暴 ...
TCP/IP协议中的三次握手和四次挥手
1 三次握手在TCP/IP协议中,由于需要建立安全且稳定的连接,所有需要进行多次确认。
第一次握手:客户端需要与服务端建立连接,此时客户端会向服务端发送一个连接请求,即将请求头中的SYN字段设置为1,表示需要建立请求,并发送一个客户端的32位的序列号seq1(该序列号由主机随机生成),该序列号用于后续客户端向服务端发送数据时给数据包的一个序列号,服务器端可以通过判断当前序列是否在某一个区间内,如果不在该区间内,表示当前的数据包不是当前客户端发送是数据,可以直接丢弃。
第二次握手:服务端接收到客户端的请求,向客户端发送一个确认建立连接的请求,将请求头中的ACK字段设置为1,并在客户端的序列号seq1的基础上进行加1的操作,客户端通过该序列号来确认是否是一个可信的服务器发送回来的请求,在确认信息中,服务器端也会发送服务端的一个序列号,该序列号用于发送数据时的数据包的编号,每发送一个序列号编号加1。
第三次握手:由于客户端向服务端发送了一个需要建立连接的请求,此时服务器端表示同意建立建立,向客户端返回了一个确认信息,此时客户端已经准备好和服务端建立连接了,但是服务端还没有收到来自客户端 ...
全面解析RNN,LSTM,Seq2Seq,Attention注意力机制
本文将会使用大量的图片和公式推导通俗易懂地讲解RNN,LSTM,Seq2Seq和attention注意力机制(结合colah’s blog 和CS583),希望帮助初学者更好掌握且入门,若有已经掌握RNN,LSTM的读者自行跳过阅读即可,更详细的讲解在Seq2Seq,Attention那。
目录
RNN
LSTM
Seq2Seq
注意力机制
参考
1 RNN(递归神经网络)我们知道人类并不是从零开始思考东西,就像你读这篇文章的时候,你对每个字的理解都是建立在前几个字上面。你读完每个字后并不是直接丢弃然后又从零开始读下一个字,因为你的思想是具有持续性的,很多东西你要通过上下文才能理解。
然而传统的神经网络并不能做到持续记忆理解这一点,这是传统神经网络的主要缺点。举个例子,你打算使用传统的神经网络去对电影里每个时间点发生的事情进行分类的时候,传统的神经网络先让不能使用前一个事件去推理下一个事件。
RNN(递归神经网络)可以解决这个问题。他们是带有循环的神经网络,允许信息在其中保留。
在上图中,A代表神经网络主体,表示网络的输入,表示网络的输出。循环结构允许信息从当前输出传递到下一次 ...
对c++中虚函数和纯虚函数的理解
1 虚函数和纯虚函数的作用
定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数,才代表函数没有被实现。定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
https://blog.csdn.net/Hackbuteer1/article/details/7558868
c++中的虚函数是为了实现多态而诞生的,纯虚函数是为了实现抽象类的概念,这两个函数的作用都是为了增强c++语言的面向对象编程能力。话不多说,直接上代码案例。
2 虚函数虚函数为了实现多态,也就是同一个函数有多种不同的形态。在程序应用中,可以这么理解,就是用父类的指针去调用子类中的方法,这样就大大较少了程序中的代码量,可以用一个指针调用其所有派生类中的方法,使得编程的代码量又大大减少。
2.1 虚函数的定义虚函数的定义很简单,就是在该函数前面加一个virtual关键字,告诉编译器,这是一个虚函数。形式如下:
父类中的写法:
1virtual void say(){cout << ...
c++序列化以及反序列化实现
1 什么是序列化和反序列化
当我们在写程序时,比如说我们自定义了一个实体类Person,然后在程序中创建一个该实体类对象,并给对象赋了一些值,但是我们想将这些数据发给我们的其他的程序员朋友,让他们也可以调用我们创建的这个实体类并使用我们的数据,这个时候我们就需要使用到序列化和发序列化。
1.1 序列化序列化就是将内存中运行的程序中的数据结构数据存储到磁盘的文件中,使其能够持久化存在电脑中,就算程序停止,这些数据也能一直存在。、
1.2 反序列化顾名思义,也就是序列化的反操作,就是将已经存在磁盘文件中的数据读取到程序中继续使用的这么一个操作。
2 代码实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101#include <iostream> ...
github如何上传大于100M的文件
在命令行输入如下命令:
1git config http.postBuffer 524288000
然后执行git config -l查看配置,我们会发现最下面会多出一条记录:
12345678910111213141516171819202122232425262728293031323334$ git config -lcore.symlinks=falsecore.autocrlf=truecore.fscache=truecolor.diff=autocolor.status=autocolor.branch=autocolor.interactive=truehelp.format=htmlrebase.autosquash=truehttp.sslcainfo=G:/software/git/Git/mingw64/ssl/certs/ca-bundle.crthttp.sslbackend=openssldiff.astextplain.textconv=astextplainfilter.lfs.clean=git-lfs clean -- %ffilt ...