- 博客(47)
- 收藏
- 关注
原创 leetcode—二叉搜索树的后续遍历
二叉搜索树的后续遍历题目来源: leetcode传送门输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树: 5 / \ 2 6 / \ 1 3示例1:输入: [1,6,3,2,5]输出: false示例2:输入: [1,3,2,6,5]输出: true提示:数组长度 <= 1000方法一:暴力求树的存在性刚
2021-10-09 17:13:44
225
1
原创 树的非递归先序、中序、后序遍历
树的非递归三种遍历此文章用来做记忆的,所以直接给代码了:先序遍历vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode*> s; vector<int> ans(0); if(root == nullptr) return ans; s.push(root); while(!s.empty()) { TreeNode*
2021-10-07 23:29:24
92
原创 leetcode—数组—搜索插入位置
搜索插入位置题目类型: 数组题目来源: leetcode传送门给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。示例1:输入: nums = [1,3,5,6], target = 5输出: 2示例2:输入: nums = [1,3,5,6], target = 2输出: 1示例3:输入: nums = [1,3,5,6], target = 7输出:
2021-10-02 20:23:10
150
原创 leetcode—数组—在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置题目类型: 数组题目来源: leetcode传送门给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?示例1:输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]示例2:输入:nums = [5,7,7,
2021-10-02 19:59:24
124
原创 leetcode—数组—搜索旋转排序数组
搜索旋转排序数组题目类型: 数组题目来源: leetcode传送门整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6
2021-10-02 16:16:57
70
原创 leetcode—数组—下一个排列
下一个排列题目类型: 数组题目来源: leetcode传送门实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。示例1:输入:nums = [1,2,3]输出:[1,3,2]示例2:输入:nums = [3,2,1]输出:[1,2,3]示例3:输入:nums = [1,1,5]输出:[1,5,
2021-10-01 21:05:12
82
原创 leetcode—数组—移除元素
移除元素题目类型: 数组题目来源: leetcode传送门给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums
2021-10-01 17:32:50
108
原创 leetcode—数组—删除有序数组中的重复项
删除有序数组中的重复项题目类型: 数组题目来源: leetcode传送门给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,
2021-10-01 13:24:14
86
原创 leetcode—数组—四数之和
四数之和题目类型:数组题目来源: leetcode传送门给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] :0 <= a, b, c, d < na、b、c 和 d 互不相同nums[a] + nums[b] + nums[c] + nums[d] == target你可以按 任意顺序 返回答案 。示例1:输入:nums = [
2021-09-30 11:46:09
128
原创 leetcode—数组—最接近的三数之和
最接近的三数之和题目类型:数组题目来源: leetcode传送门给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/3sum-closest著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。示例:输入:nums = [-1,2,1,-4],
2021-09-29 21:24:00
98
原创 leetcode—数组—三数之和
三数之和题目类型:数组题目来源: leetcode传送门给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。**注意:**答案中不可以包含重复的三元组。示例1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例2:···输入:nums = []输出:[]···示例3:···输入:nums = [0]输出:[]
2021-09-29 21:06:26
261
原创 计算机网络(第四章,传输层(上))
计算机网络(第四章,传输层(上))传输层服务开篇传输层概述复用和分用复用和解复用无连接传输协议-UDPUDP可靠数据传输的基本原理可靠数据传输概述rdt2.0rdt2.1传输层服务开篇理解传输层服务的基本理论和基本机制复用/分用可靠数据传输机制流量控制机制拥塞控制机制掌握Internet的传输层协议UDP:无连接传输服务TCP:面向连接的传输服务TCP拥塞控制传输层概述传输层协议为运行在不同Host上的进程提供了一种逻辑通信机制端系统运行传输层协议:发
2020-10-06 20:42:47
453
1
原创 计算机网络(第三章,网络应用(下))
P2P应用P2P应用_原理与文件分发纯P2P架构:没有服务器;任意端系统之间直接通信;节点阶段性接入Internet;节点可能更换IP地址对于C/S:服务器串行地发送N个副本,时间为:NF/us客户机i需要F/di时间下载所以从一个服务器向N个节点分发一个文件需要dcs=max{NF/us,F/min{di}}的时间对于P2P:服务器必须发送一个副本:F/us客户机i需要F/di时间下载总共需要下载NF比特最快的可能上传速度为us+Σui所以一个服务器向N个节点分发一个文件需要dP2
2020-09-28 19:09:15
331
原创 计算机网络(第二章,网络应用(上))
计算机网络(第二章,网络应用(上))网络应用(层)内容概述网络应用的基本原理网络应用体系结构网络应用进程通信网络应用需求Web应用Web应用概述HTTP连接类型HTTP消息格式Cookie技术Web缓存技术Email应用Email应用概述Email消息格式与POP协议DNS应用DNS概述DNS记录和消息 这是本人初学《计算机网络》做的一些笔记,随着深入理解与学习,会对笔记进行改进 网络应用(层)内容概述这讲的主要内容有:网络应用体系结构{客户机/服务器P2P混合结构\begin{cases}
2020-09-22 19:43:52
256
原创 计算机网络(第一章,计算机网络概述)
计算机网络(第一章)计算机网络基本概念什么是计算机网络什么是网络协议计算机网络结构计算机网络结构 待更新 计算机网络基本概念什么是计算机网络计算机网络是通信技术与计算机技术紧密结合产物计算机网络就是互联的、自治的计算机集合,其中自治是指无主从关系,互联是指互联互通什么是网络协议硬件(主机、路由器、通信链路等)是计算机网络的基础计算机网络中的数据交换必须遵守实现约定好的规则网络通信:通信主体是“机器”,而不是人;交换“电子化”或“数字化”消息;计算机网络的所有通信过程都必须遵守某种
2020-09-20 21:15:46
469
原创 哈工大2020春软件构造Lab4实验报告
实验报告只是为了提供给学弟学妹们参考,所以很多代码都没有完整给出,希望学弟学妹们只用来参考,请勿直接抄袭!!!有问题请联系QQ:1187987704文章目录1 实验目标概述2 实验环境配置3 实验过程3.1 Error and Exception Handling3.1.1 处理输入文本中的三类错误3.1.1.1 SameAirportException(飞机起落机场相同)3.1.1.2 PlaneTypeException(飞机型号异常)3.1.1.3 PlaneSeatsException(飞机.
2020-06-15 16:35:49
290
原创 哈工大2020春软件构造Lab3实验报告
实验报告只是为了提供给学弟学妹们参考,所以很多代码都没有完整给出,希望学弟学妹们只用来参考,请勿直接抄袭!!!有问题请联系QQ:1187987704文章目录1 实验目标概述2 实验环境配置3 实验过程3.1 待开发的三个应用场景3.2 面向可复用性和可维护性的设计:PlanningEntry3.2.1 PlanningEntry的共性操作3.2.2 局部共性特征的设计方案3.2.3 面向各应用的PlanningEntry子类型设计(个性化特征的设计方案)3.3 面向复用的设计:R3.4 面向复用的设.
2020-06-15 16:23:20
534
原创 哈工大2020春软件构造Lab2实验报告
实验报告只是为了提供给学弟学妹们参考,所以很多代码都没有完整给出,希望学弟学妹们只用来参考,请勿直接抄袭!!!有问题请联系QQ:1187987704文章目录1 实验目标概述2 实验环境配置3 实验过程3.1 Poetic Walks3.1.1 Get the code and prepare Git repository3.1.2 Problem 1: Test Graph 3.1.3 Problem 2: Implement Graph 3.1.3.1 Implement ConcreteEdge.
2020-06-15 10:57:49
731
原创 哈工大2020春软件构造Lab1实验报告
实验报告只是为了提供给学弟学妹们参考,所以很多代码都没有完整给出,希望学弟学妹们只用来参考,请勿直接抄袭!!!有问题请联系QQ:1187987704文章目录1实验目标概述2实验环境配置3实验过程3.1Magic Squares3.1.1isLegalMagicSquare()3.1.2generateMagicSquare()3.2Turtle Graphics3.2.1Problem 1: Clone and import3.2.2Problem 3: Turtle graphics and dr.
2020-06-15 10:21:24
796
原创 Java的正则表达式语法
Java的正则表达式语法在之前的实验中也用到过正则表达式,但是用的都是比较基础的语法,有一些高级一点的用法还没有用到,所以今天来讲一下正则表达式的语法注意:我只列出了常用的,其他的不常用的语法在这里没有体现字符作用\将其下一个字符标记为特殊字符、文本、反向引用^匹配输入字符串开始的位置$匹配输入字符串结束的位置*匹配前面的字符或表达式0次及以上+匹配前面的字符或表达式1次及以上?匹配前面的字符或表达式0次或1次{n}匹配前面的字符或
2020-06-15 09:50:49
158
原创 Java中删除容器中元素的方法
Java中删除容器中元素的方法Java中删除容器中元素的方法1. Set中删除元素2. List中删除元素3. Map中删除元素4. 总结Java中删除容器中元素的方法在做实验时,由于是第一次上手Java,所以对于一些使用方法还是有些不熟悉的,今天就来介绍一下我遇到的一个问题,就是如何删除容器中的元素,我们都知道常见的方法就是使用自带的remove(),我之前也是一直这样使用的,直到有一次发生了“莫名其妙”其实是因为我对Java了解的太少 的bug,下面就来对常用的Set,List,Map来分别看一下
2020-06-14 15:00:18
1466
原创 Java设计模式之factory、abstract factory、proxy、observer、visitor、state、memento
Java设计模式之factory、abstract factory、proxy、observer、visitor、state、memento设计模式(二)1. Factory(工厂模式)1.1 目的1.2 使用方法1.3 工厂方法的优缺点2. Abstract Factory(抽象工厂模式)2.1 目的2.2 使用方法2.3 抽象工厂方法的优缺点3. Proxy(代理模式)3.1 目的3.2 使用方法3.3 代理模式的优缺点更新中,待更新内容为observer、visitor、state、memento
2020-06-12 17:08:02
763
原创 Java设计模式之adapter,decorator,facade,strategy,template,iterator
Java中的设计模式(一)设计模式(一)1.adapter(适配器模式)1.1目的1.2使用方法适配器模式的优缺点2.Decorator(装饰者模式)2.1目的2.2使用方法2.3装饰者模式的优缺点3.Facade(外观模式)3.1目的3.2使用方法外观模式的优缺点更新中,最晚明天更新完strategy、template、iterator设计模式(一)很多设计模式,在学习的过程中不好理解,并且许多设计模式在一起讲,难免会有混淆,所以今天来逐个解释一下1.adapter(适配器模式)1.1目的
2020-06-09 17:01:13
377
原创 override与overload的理解
Java中的override与overloadoverride与overloadoverrideoverloadoverride与overload在学习软件构造时,这两个概念开始是有些容易混淆的,并且对于一些特殊的情况不能做出很好的判断,今天就来讲述一下这两个的区别overrideoverride可以叫做重写或者覆盖,主要是在父类与子类之间体现,同时加上@override会自动检查与被重写的方法名,返回值,参数列表是否一致,当子类重写了父类的方法时,在子类的对象调用此方法时,调用的就是子类中的这个方
2020-06-07 14:36:22
258
原创 对于AF、RI、Safety from rep exposure的理解
对于AF、RI、Safety from rep exposure的理解AF、RI、Safety from rep exposureAFRISafety from rep exposureAF、RI、Safety from rep exposureAF、RI、Safety是从开始做实验就接触的一个东西,但是只是知道他们大概是什么,上课时也将了关于这个的内容,但是始终没有一个很好的理解,今天来简要的讲述一下我的理解AF首先AF的全称是:Abstraction function(抽象函数),根据函数我们就
2020-06-07 12:46:31
616
原创 Java中的可变类与不可变类
可变类与不可变类在学习软件构造课程时,一直对可变类与不可变类没有一个很清晰的认识,有些疑问,类似于:如果不可变类中是因为没有变值器才让他不可变的话,那么getter后得到的对象也是不可变类中的对象,那么获得之后不就是可以对其改变了吗,为什么不会影响不可变类中的对象呢?要弄清这个问题,首先要理解可变数据类型与不可变数据类型可变数据类型与不可变数据类型可变数据类型:对于一个可变数据类型的变量,当其值发生变化时,和原来的变量采用的是一个地址空间,即在原内存的基础上,对值进行的修改不可变数据类型:与可
2020-06-04 11:15:24
442
原创 2020.05.29软件构造听课笔记
锁与同步:线程安全不应该依赖于偶然前三种策略的核心思想:避免共享→即使共享,也只能读/不可写→即使可写,共享的可写数据应自己具备在多线程之间协调的能力,即使“使用线程安全的mutable ADT”缺陷:不能用全局rep共享数据→只能“读”共享数据,不能写→可以共享“读写”,但只有单一方法是安全的,多个方法调用就不安全了很多时候,无法满足上述三个条件→要读写共享数据,且线程中的读写操作复杂程序员来负责多线程之间对mutable数据的共享操作,通过“同步”策略,避免多线程同时访问数据使用锁
2020-05-29 09:39:45
122
原创 2020.05.27软件构造听课笔记
线程安全:线程之间的“竞争条件”:作用于同一个mutable数据上的多个线程,彼此之间存在对该数据的访问竞争并导致interleaving,导致post-condition可能被违反,这是不安全的线程安全:ADT或方法在多线程中要执行正确4种线程安全的方法:1.限制数据共享2.共享不可变数据3.共享线程安全的可变数据4.同步机制:通过锁的机制共享线程不安全的可变数据,变并行为串行策略1:Confinement将可变数据限制在单一线程内部,避免竞争不允许任何其他线程直接读写该数据
2020-05-27 11:39:28
97
原创 2020.05.22软件构造听课笔记
并发:网络上的多台计算机一台计算机上的多个应用一个CPU上的多核处理器多用户并发请求服务器的计算资源APP在手机端和在云端都有计算GUI的前端用户操作和后台的计算同时进行为什么要并发:摩尔定律失效了“核”变得越来越多为了充分利用多核和多处理器,需要将程序转化为并行程序共享内存:并发模块在内存中读写共享数据消息传递:并发模块通过channel交换信息共享内存:两个处理器,共享内存同一台机器上的两个程序,共享文件系统同一个Java程序内的两个线程,共享Java对象消息
2020-05-22 09:42:54
127
原创 2020.05.20软件构造听课笔记
断言和异常处理都可以处理同样的错误开发阶段用断言尽可能消除bugs在发行版本里用异常处理机制处理漏掉的错误对于来自外部的数据源要仔细检查,例如:文件、网络数据、用户输入等Barricade:类的public方法接收到的外部数据都应该被认为是dirty的,需要处理干净再传递到private方法——隔离舱隔离舱外部的函数应该使用异常处理,隔离舱内的函数应该使用断言处理增加了复杂性、运行时间和维护成本防御性代码本身也有可能存在缺陷设计好如何进行防御,制定相应的防御策略Debug的目
2020-05-20 14:27:38
103
原创 2020.05.15软件构造听课笔记
对于可恢复/期望恢复的情况,抛出checked异常对于程序出错、不确定是否可恢复,抛出unchecked异常尽可能在checked异常中提供方法和丰富的信息,以便协助恢复不建议声明Error类型异常、不建议声明RuntimeException类型的异常方法要在定义和spec中明确声明所抛出的全部checked异常没有声明所有抛出的checked异常,编译会出错unchecked异常和Error可以不用处理如果子类型中override了父类型中的函数,那么子类型中方法抛出的异常不能比父类型
2020-05-18 15:10:49
85
原创 2020.05.13软件构造听课笔记
健壮性:系统在不正常输入或不正常外部环境下仍能够表现正常的程度Paranoia(偏执狂):总是假设用户恶意、假定自己的代码可能失败Stupidity:把用户想象成白痴,可能输入任何东西Robustness principle (Postel's Law):对别人宽容点、对自己狠一点Dangerous implements:封闭实现细节,限定用于的恶意行为Can't happen:考虑极端情况,没有“不可能”正确性:程序按照spec加以执行的能力,是最重要的质量指标正确性:永不给用户错误的结果
2020-05-17 12:59:47
99
原创 2020.05.06软件构造听课笔记
State-based construction:使用有限的状态机来定义程序的行为,使用有限状态来控制程序想执行根据当前状态,决定下一步要执行什么操作,执行操作之后要转移到什么新的状态核心思想:将程序看作一个有限状态自动机,侧重于对“状态”及“状态转换”的抽象和编程程序的执行被分解为一组自动执行的步骤各步骤之间的通讯通过“状态变量”执行程序执行就可以看作是各自动步骤的不断循环使用枚举...
2020-05-06 11:42:40
123
原创 2020.04.29软件构造听课笔记
工厂方法模式:工厂方法模式也被称为“虚拟构造器”当client不知道/不确定要创建哪个具体类的实例,或者不想在client代码中指明需要具体创建的实例时,有工厂方法定义一个用于创建对象的接口,让该接口的子类型来决定实例化哪一个类,从而使一个类的实例化延迟到其子类静态工厂方法相比于通过构造器(new)构建对象:1.静态工厂方法可具有指定的名称2.不必在每次调用的时候都创建新对象3.可...
2020-04-29 11:45:12
141
原创 2020.04.24软件构造听课笔记
软件维护:修复错误、改善性能运维是软件开发中最困难的工作之一,涉及到其他所有环节处理来自用户报告的故障/问题阿里运维工程师职责:负责系统稳定性工作;生产系统部署、上线;维护生产系统网络安全、稳定、可靠;维护生产系统数据备份岗位要求:深入理解运维体系结构,精于容量规划、架构设计、性能优化;熟悉服务管理、单元部署、自动扩容等运维系统建设,对成本控制和效能提升有深刻的理解...
2020-04-24 09:39:34
109
原创 2020.04.22软件构造听课笔记
除了类本身,设计模式更强调多个类/对象之间的关系和交互过程——比接口/类复用的粒度更大设计模式分类:创建型模式、结构型模式、行为类模式Adapter模式(适配器模式):将某个类/接口转换为client期望的其他形式解决类之间接口不兼容的问题通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类Decorator设计模式(装饰器模式):为对象增加不...
2020-04-22 11:47:36
108
原创 2020.04.17软件构造听课笔记
<? super A>下限通配符,A及其父类<? extends A>上限通配符,A及其子类List<? extends Number> list,意味着list可以匹配多种类型中的一种,但并不意味着同一个list可以存放所有这些的类型,无限定通配符和下限通配符同理委托/委派:一个对象请求另一个对象的功能委派是复用的一种常见形式很多设计模式将继承...
2020-04-17 09:44:58
103
原创 2020.04.15软件构造听课笔记
面向复用编程:开发出可以复用的软件基于复用编程:利用已有的可复用软件搭建应用系统复用的特点:很大的适应性降低成本和开发时间充分的测试->高可靠标准化、一致化针对性不强->性能差开发可复用软件的成本要高于一般软件的成本:要有组稿的适应性性能差些:针对更普适的场景,缺少足够的针对性使用已有软件进行开发:可复用软件库,对其进行有效的管理往往无法拿来就用,需要适配...
2020-04-15 11:45:27
120
原创 2020.04.03软件构造听课笔记
现实中的每个对象实体都是独特的,所以无法完全相等,但有“独特性”在人类语言和数学中,“绝对相等”是存在的等价关系:自反、对称、传递ADT是对数据的抽象,体现为一组对数据的操作抽象函数AF:内部表示->抽象表示基于抽象函数AF定义ADT的等价操作如果AF映射到同样的结果,则等价站在外部观察者角度:对两个对象调用任何相同操作,都会得到相同结果,则认为这两个对象是等价的,反之亦...
2020-04-03 09:43:46
89
原创 2020.04.01软件构造听课笔记
静态方法无法直接调用非静态成员Interface和Class:实现和定义ADT接口中只有方法的定义,没有实现接口之间可以继承与扩展一个类可以实现多个接口(从而具备了多个接口中的方法)一个接口可以有多种实现类接口:确定ADT规约类:实现ADT也可以不需要接口直接使用类作为ADT,既有ADT定义也有ADT实现实际中更倾向于使用接口来定义变量打破了抽象边界,接口定义中没有包含c...
2020-04-01 11:45:59
89
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人