自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 收藏
  • 关注

原创 操作系统-1

寄存器,高速缓存,内存结构(主存 ram),磁盘高速缓存一般分多级,L1,L2等,对L1访问一般没有延时,对L2一般延迟一两个时钟周期以磁盘为例子,读写头移动到柱面和移动到扇区的指定位置需要毫秒级别的延迟虚拟内存,主存作为缓存,程序放入磁盘,需要快速映射到主存的物理地址,这是储存器管理单元做的事情(MMU)程序的切换被称为上下文切换io设备控制器,或者一般称为物理驱动,是小型标准化的嵌入式DMA(直接储存访问)可以控制主存和一些控制器之间的位流,无需cpu的持续干预,cpu对dma进行设置,说.

2021-10-09 13:20:40 159

原创 jvm-8-java

static(静态)方法,和静态变量一样,属于类本身,在类加载的时候就被加载到内存,而其他方法在实例化的时候才会被加载到内存。静态方法由线程共享,不会自动销毁,直到jvm关闭调用方法的时候,编译器预先计算好调用该方法需要的操作数栈的深度以及局部变量表的空间(都属于虚拟机栈,为线程私有)编译后的java代码储存在class字节码文件中,虚拟机栈、帧、操作数栈、局部变量表是存放变量或结构的地方,这些结构中的数据由jvm中字节码的指令集操作...

2021-10-05 20:40:21 151

原创 jvm-7

类加载器(加载java源码编译形成的class)需要寻找类的位置类加载器有启动、扩展、用户类加载器三种,除了启动类加载器没有父类,其他都用父亲类,jvm先尽量调用父亲类加载器,父亲类无法加载则一级一级往子类推送加载抽象类和普通类一样有成员方法,成员变量,构造方法等,但是没有实例化,必须被继承之后实例化关于常量池的位置:java6之前,存放在方法区(永久代)中,java7存放在堆中,java8取消了永久代,设置了元空间,元空间占用操作系统内存,运行时常量池和静态常量池存放在元空间中,字符串常量池依然存.

2021-09-27 19:46:42 145

原创 jvm-6

即时编译器(JIT)和解释器的区别:解释器将字节码转为机器码,下次遇到得重新转,JIT将一些字节码编译为机器码,并存入code cache,下次遇到同样的,直接执行,无需再次编译。JIT会根据平台差异,生成平台特定的机器码。hotspot虚拟机的原理Java内存模型(jmm)定义了一套在多线程读写共享数据时,对数据的可见性、有序性、原子性的规则java reflection,允许获取自身的信息,并且可以操作类或者对象的内部属性。一般对象的类型在编译期间就会确定下来,jvm通过在运行时候动态加载类来实现.

2021-09-26 12:55:40 120

原创 跳跃数组2-贪心

跳跃数组2-贪心题目:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例: 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。说明: 假设你总是可以到达数组的最后一个位置分析:搞清楚每一步可以跳到的最远的位置,如果当前步走完都不能达到(过程中也在更新下一步能到的最远

2021-09-25 13:28:24 333

原创 跳跃游戏-贪心

跳跃游戏-贪心题目:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1: 输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例 2: 输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

2021-09-25 12:55:35 74

原创 最大子序和-贪心

最大子序和-贪心题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。分析:贪心的规则为:当累积和局部最大,就更新,当累积和小于0了,就重新累积#include "_myPrint.cpp"class Solution{public: int maxArrSum(vector<int>

2021-09-25 12:08:46 79

原创 摆动数列-贪心

摆动数列-贪心题目:如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一

2021-09-25 11:45:26 184

原创 jvm-5

加入大对象时候,对象过大,直接放入老年代,不会引起gc垃圾回收器:串行,吞吐量优先,响应时间优先串行:单线程,堆内存较小,个人电脑吞吐量和响应时间:并行,多线程,堆内存较大。吞吐量优先:单位时间内,STW时间最短:0.2+0.2=0.4,(吞吐量最大)响应时间优先:单次STW时间最短:0.1+0.1+0.1+0.1+0.1=0.5,(每次响应更快)...

2021-09-24 21:28:59 56

原创 jvm-4

java中NIO(直接内存),比普通io速度更快,且不受到gc作用,NIO免去了系统缓存和java缓存的传输这一步骤垃圾回收:通常有引用计数方法和可达性方法,引用计数法存在循环引用的问题(互相引用,都不能被回收)可达性分析:查看对象是否能通过gc root对象找到引用:强,软,弱,虚垃圾回收算法:标记清除,先标记再清楚,不用连续,容易产生内存碎片标记整理:在标记清除的基础上再做一步整理,避免内存碎片,但效率低,例如需要移动引用对象的地址复制算法:两个区域,一个区域的存活对象复制(顺便整理)到另.

2021-09-23 21:38:07 61

原创 jvm笔记-3

stringtable特性,intern方法主动将字符串放入串池jvm 1.8中,将字符串尝试放入串池,有则不会放入,没有则放入,并将串池中对象放回jvm 1.6中,没有则将对象复制一份,放入串池,返回串池中的对象stringtable是常量池的一部分,在1.6位置处于永久代中,在1.8处于元空间中,前者需要fullgc,后者只需要metagc...

2021-09-23 20:24:57 91

原创 jvm笔记-2

jvm 1.6 类,类加载器和常量池用堆内存中的永久代实现到了jvm 1.8 ,类,加载器和常量池被放入了元空间,元空间占用操作系统内存而不是堆内存cglib常量池是储存指令的常量表,根据指令编号在常量池中查找,跳转指令运行时常量池就是将指令编号加载到运行内存中串池(stringtable),例如,string xx = “a”,a首先为常量池中的符号,还没有变成字符串对象,通过string指令后,会首先在stringtable中寻找是否有“a”,没有就声明这一对象并加载进入stringtabl.

2021-09-22 14:11:01 51

原创 jvm笔记-1

程序计数器不考虑内存溢出程序计数器是线程私有的栈帧是方法需要的,通常将方法的参数,变量,返回地址放入栈帧一个方法对应一个栈帧,如果方法调用了其他方法,其他方法的栈帧也被压入栈所以垃圾回收不管栈内存,栈内存会随着方法的调用自动变动栈内存空间并不是越大越好,栈内存越大,总物理内存一定,能并发的线程越少方法内的局部变量是否是线程安全的? 如果局部变量没有逃离方法的作用范围,则安全;如果局部变量引用了对象且逃离了范围,则不安全。栈内存溢出:栈帧过多和栈帧过大都会导致溢出本地方法栈就是为native.

2021-09-21 21:19:38 52

原创 组合-回溯法

组合-回溯法给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1: 输入:candidates = [2,3,6,7], target = 7, 所求解集为: [ [7], [2,2,3] ]示例 2: 输入:candidates = [2,3,5], target

2021-09-08 23:14:12 203

原创 电话上数字对应的所有字母组合

电话上数字对应的所有字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。分析:回溯模版,想清楚广度遍历什么,深度遍历什么,index索引什么#include "_myPrint.cpp"using namespace std;// 电话上数字对应多个字母 如2对应abc// 给一串数字 返回这串数字对应的所有字母可能的组合方式class Solution{private: // 建立从数字

2021-09-08 22:38:24 308

原创 组合总和-回溯法

组合总和-回溯法找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。解集不能包含重复的组合。示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]]示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]分析:回溯法模版,剪枝操作#include "_myPrint.cpp"using namespace std;// 回溯法求

2021-09-07 21:10:28 282

原创 组合问题-回溯法

组合问题-回溯法给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。示例:输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]回溯法模版,剪枝优化#include "_myPrint.cpp"using namespace std;// 回溯法求组合问题class Solution{public: vector<vector<int>> res;

2021-09-07 20:37:08 167

原创 修剪二叉搜索树

修剪二叉搜索树给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。二叉搜索树是中序非递减,因此可能删除的节点在中间位置,不一定会在叶子节点位置。#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 给定一个区间【low,high】 修减二

2021-09-07 19:05:12 49

原创 二叉树的最近公共祖先

二叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”分析:递归三部曲。有返回值时,子节点的返回值如何界定#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 找最近公共祖先cla

2021-09-06 20:23:06 41

原创 BST中的众数(中序非递减)

BST中的众数(中序非递减)- 对比普通二叉树的众数给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树分析:BST和中序绑定在一定#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;class Soluti

2021-09-05 10:50:41 99

原创 判断BST

判断BST给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树分析:递归三要素,迭代中序的写法不太一样#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 验证二叉搜索树// 递归和迭代法class Solution{public:

2021-09-05 09:50:19 150

原创 最大二叉树

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个树的根节点。分析:注意开闭区间#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 给定数组 构造最大二叉树// 最大二叉树是数组中最大元

2021-09-04 16:12:53 102

原创 根据一棵树的中序遍历与后序遍历构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。分析:区间的开闭要统一,使用变动索引的方式就无需辅助空间了#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 从中序和后序遍历构造二叉树 假定二叉树中没有重复元素class Solution{public: TreeNode* inPost2Tree(vector<int>& in,

2021-09-04 15:41:42 179

原创 二叉树路径和-函数是否有返回值

二叉树路径和-函数是否有返回值one:给定二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明:叶子节点是指没有子节点的节点。two:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点分析:全局遍历不能有返回值,局部搜索需要返回值#include "_myPrint.cpp"#include "stack"#include "queue"using namespace s

2021-09-04 14:12:30 50

原创 求二叉树左下角的值

求二叉树左下角的值给定一个二叉树,在树的最后一行找到最左边的值分析:遍历整个树时候用void方法配合全局变量,递归遍历部分时候需要返回值#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 找到二叉树中左下角的值// 左下角为最深一层最左边的值class Solution{public: // 确定递归的参数和返回值 // 确定每一层递归需要做的事情 // 确定

2021-09-04 10:49:04 92

原创 计算给定二叉树的所有左叶子之和

计算给定二叉树的所有左叶子之和。分析:注意左叶子的定义,首先自己为左节点,其次没有孩子节点。自己是否为左节点要通过父亲节点判断,因此判断逻辑用父亲节点。#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 找到二叉树中左叶子之和class Solution{public: // 确定递归的参数和返回值 // 确定每一层递归需要做的事情 // 确定递归的终止条件

2021-09-04 09:58:28 352

原创 求二叉树的所有路径

求二叉树的所有路径给定一个二叉树,返回所有从根节点到叶子节点的路径说明:叶子节点是指没有子节点的节点。分析:递归中隐含着回溯,注意回溯的写法,以及void函数中参数的传递。#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 找到二叉树中所有路径class Solution{public: // 确定递归的参数和返回值 // 确定每一层递归需要做的事情 // 确

2021-09-04 09:22:09 132

原创 求二叉树的最大和最小深度-后序 前序 层序

求二叉树的最大和最小深度-后序 前序 层序给定二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。分析:后序求高度 前序求深度 层序的层数就是深度#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 求一颗二叉树的深度class Solution{public: // 确定递归的参数和返回值 // 确定每

2021-09-03 21:38:08 113

原创 判断二叉树是否对称-递归和迭代

判断二叉树是否对称-递归和迭代给定二叉树,检查它是否是镜像对称的。例如,二叉树[1,2,2,3,4,4,3]是对称的。但是下面这个[1,2,2,nu11,3,nu11,3]则不是镜像对称的:分析:注意null位置,如果先左右中(后序)遍历一遍,再右左中遍历,两者数组一样,也并不能说明二叉树镜像,一定要同时从两个方向遍历同一个树。#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 判断一

2021-09-03 19:54:12 110

原创 翻转二叉树(结果和原始的轴对称)

翻转二叉树(结果和原始的轴对称)可以使用前序(后序)遍历,便于翻转#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;class Solution{public: // 确定递归的参数和返回值 // 确定每一层递归需要做的事情 // 确定递归的终止条件 TreeNode* invertTree(TreeNode* root){ //前序递归 if

2021-09-01 21:18:20 63

原创 二叉树层序遍历模版

二叉树层序遍历模版#include "_myPrint.cpp"#include "_TreeNode.cpp"#include "stack"#include "queue"using namespace std;class Solution{public: vector<vector<int>> levelOrder(TreeNode* root){ vector<vector<int>> res;

2021-09-01 19:54:34 56

原创 二叉树三序遍历-迭代法

二叉树三序遍历-迭代法分析:前后写法思想类似,中序写法不同#include "_myPrint.cpp"#include "_TreeNode.cpp"#include "stack"using namespace std;class Solution{public: vector<int> inTravel_(TreeNode* root){ vector<int> res; stack<TreeNode*> st

2021-09-01 19:30:12 55

原创 二叉树深度搜索-前中后三序遍历

二叉树深度搜索-前中后三序遍历-递归法分析:注意递归的三个要素#include "_myPrint.cpp"#include "_TreeNode.cpp"using namespace std;// 递归的三要素// 参数和返回值,每层递归需要实现的逻辑,递归终止的条件class Solution{public: void travel(TreeNode* cur, vector<int>& vec){ if (cur == NULL) ret

2021-08-31 23:11:37 54

原创 map 小顶堆的实现-基本语法和用法

map 小顶堆的实现-基本语法和用法题目:给定一个非空的整数数组,返回其中出现频率前k高的元素。示例1:输入:nums=[1,11,2,2,3],k=2 输出:[1,2示例2输入:nums=[1],k输出:[1提你可以假设给定的k总是合理的,且1≤k≤数组中不相同的元素的个数。 你的算法的时间复杂度必须优于O( n log n),n是数组的大小。题目数据保证答案唯一,换句话说,数组中前k个高频元素的集合是唯一的。·你可以按任意顺序返回答案。分析:注意写法#include "_myPr

2021-08-31 22:15:04 185

原创 求滑动窗口的最大值-线性时间

求滑动窗口的最大值-线性时间题目:给定一个数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在 滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。进阶你能在线性时间复杂度内解决此题吗?分析:使用deque维护front位置始终最大的队列#include "_myPrint.cpp"#include "deque"using namespace std;class Solution{public: vector<in

2021-08-31 19:45:46 57

原创 基础栈操作-求解波兰表达式

基础栈操作-求解波兰表达式题目:根据逆波兰表示法,求表达式的值。有效的运算符包括。每个运算对象可以是整数,也可以是另一个逆波兰表达式说明整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得岀有效数值且不存在 除数为0的情况。示例1输入:[“2”,“1”,"+",“3”,"* 输出:9解释:该算式转化为常见的中缀算术表达式为:(2+1)*3)=9分析:注意cpp中各类型,单引号和双引号不一样。注意栈的取值操作int x = st.top(); st.pop();#in

2021-08-31 19:05:49 148

原创 栈的经典应用

栈的经典应用题目:给定一个只包括"(’,")’,"{’,"},"[,"]的字符串,判断字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭 左括号必须以正确的顺序闭注意空字符串可被认为是有效字符串。示例1:输入:"()"输出:true分析:先分析出匹配失败有哪几种情况#include "stack"#include "_myPrint.cpp"using namespace std;class Solution{public: bool isValid(stri

2021-08-30 22:08:49 54

原创 kmp算法的应用

kmp算法找substr,前缀表的思想题目:实现 strstr()函数。定一个 haystack字符串和一个 needle字符串,在 haystack字符串中找出 needle字符串出现的第 位置(从0开始)。如果不存在,则返回例1:输入: haystack=“heo” needle="‖|"输出:2例2:输入: haystack=“aaa” needle="bba"输出说明:当 needle是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于本题而 言,当 needle是空字符串

2021-08-30 20:43:27 101

原创 反转一个字符串中所有单词的位置

反转一个字符串中所有单词的位置题目:给定一个字符串,逐个翻转字符串中的每个单词。输入:" the sky is b|ue" 输出:" blue is sky the"示例2输入:" hello world! 输出:“Word!helo”解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例3输入:" a good example" 输出:" example good a"解释:如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。分析:去除空格用双指针的

2021-08-25 13:55:21 138

原创 字符串替换-扩容逆序双指针

字符串替换-扩容逆序双指针题目:请实现一个函数,把字符串S中的每个空格替换成"%20"。示例1:输入:s=" We are happy! 输出:“We%20are%20 happy.”分析:将字符串扩容至结果长度,新指针在新字符串结尾,旧指针在旧字符串结尾,从后往前遍历#include "_myPrint.cpp"using namespace std;class Solution{public: string replaceSpace(string s){ int

2021-08-25 10:41:38 79

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除