- 博客(21)
- 收藏
- 关注
原创 八股文0814
虚拟内存就是当创建一个进程时,系统会分配给这个进程一个连续的地址空间,就是虚拟内存,他不是真实存在的,而是物理内存空间的映射,它允许进程访问比物理内存还大的内存空间,并且能实现进程之间内存相互隔离,当程序运行时发生内存不够的情况,可以通过页面置换额方式把部分数据写入硬盘的虚拟内存中,等需要的时候再重新载入。1.创建存储文件描述符的列表,列表的类型是fd_set,整数类型,大小为1024比特位,每个比特位表示文件描述符的状态,0表示不检测文件描述符对应的事件,1表示检测文件描述符对应的事件。
2024-08-14 20:49:35
581
原创 八股文0812
进程是资源调度的基本的单位,线程是系统执行的最小单位,进程的内存是相互隔离的,一个进程的奔溃不会影响其他进程;线程的创建、切换和销毁都销毁系统的资源,协程依赖编译语言实现,也称作用户态线程,开销比较小。1、互斥锁:当一个线程要访问某共享资源时,要先获取这个资源的互斥锁,如果这个锁已经被别的线程占有,那么这个线程就不能访问这个共享资源。5、自旋锁:当线程访问被其他线程占用的共享资源时,不马上进入阻塞状态,而是循环等待锁被释放,适用于锁持有时间比较段的场景。必要条件:互斥,不可抢占,请求保持,循环等待。
2024-08-12 22:15:08
170
原创 牛客八股文
CAS是乐观锁机制,用于多线程编程中保证数据的原子性操作,在并发场景下,会导致ABA问题,就是值在操作过程从A改到B再改到A,导致CAS操作无法正确判断数值是不是被修改。可以引入版本号或者时间戳确保数据的一致性,再每次数据变化的时候,加入版本号或者时间戳信息,CAS操作时除了比较数值意外也比较版本号,可以避免ABA问题发生。运行:获取处理机进行,获取时间片,根据时间片执行进程,时间片用完以后再次进入就绪状态。终止:进程执行完后,进入终止状态,释放资源,等待系统回收PCB空间。
2024-08-12 09:33:56
741
原创 子序列的题目
dp[i]=max(dp[i],dp[j]+1)//如果nums【i】大于nums【j】,那么就可以在dp[i]和dp[j]+1中更新最大值。dp[i][j]:长度为[0, i 的字符串text1与长度为[0, j ]的字符串text2的最长公共子序列为dp[i][j]如果不大于,就是维持1,为啥呢,看看dp【i】的定义,是是包含以i结尾的最长递增子序列,必须要以nums【i】为结尾。dp[i]:以下标i为结尾的连续递增的子序列长度为dp[i]。明确dp[i]是包含以i结尾的最长递增子序列。
2024-08-01 20:38:30
185
原创 打家结社00
则dp[i]=max(nums[i]+dp[i-2],nums[i]+dp[i-2])情况二、不搭界第i家,则dp[i]=nums[i]+dp[i-2]情况一,打劫第i家,则dp[i]=nums[i]+dp[i-2]dp存放一个数组,容量为2,第一个放的是不偷,第二个放的是偷。dp[i]是打家到第i家包括i家可以得到的最大的金钱。两种情况两种数组,最后取最大就行。后序遍历加动态规划 很牛逼。不如用求最优间距来计算。可能是为了下一步做准备。
2024-07-31 21:00:14
172
原创 动态规划继续 139
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。完全背包问题,s是背包,字符串里的单词是物品。从背包里划分出单词去哈希表里判断这个单词是否存在。并且,dp[i]指的是长度为i时,是否是true。
2024-07-25 20:50:32
111
原创 哈希表复习
题目:给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。=nums_set.end()) 说明能在nums_set找到指定的元素。它不管你元组是否重复,不管元组的元素是否重复,直接用哈希表unorder_map做,key存放value,第二个存放出现的次数;插入:map.insert(pair(nums[i],i));2.去重 好像想起来也不是很难。
2024-07-22 19:30:32
290
原创 完全背包 518||377
因此两个for循环颠倒没有关系;dp是相加的关系,不是取max。和0-1的区别是,不管是哪个循环都是正向遍历,并且i和j都是从0开始遍历。因此要先遍历背包再遍历物品;如果先遍历物品再遍历背包会重复,你算一下就知道了。求多少种零钱兑换的方式,本质是不考虑顺序的组合。这是考虑顺序的组合,也就是排列。当背包容量为0时,一种排列方式。当背包容量为3时,遍历物品。
2024-07-18 20:43:12
217
原创 0-1背包总结
y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。第i件物品的重量是weight[i],得到的价值是value[i]。注意:dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]。以上就是0-1背包的问题,方法用的都是滚动数组,滚动数组要注意的是遍历顺序:先物品后背包。j–) { // 遍历背包容量。这里的最大重量其实相当于背包能装的最大价值,因为石头的价值和重量是一样的。dp[j]表示的是容量为j的背包,所背的物品价值可以最大为dp[j]
2024-07-17 17:46:33
981
原创 343||96||0-1背包||416
心里要有一个表格,行表示物品,列表示书包容量,第一列就是书包容量为0时初始化全是0,第一行是当容量大于等于物品0的重量时初始化为物品0的价值,其他的全初始化为0;dp[i]+=dp[j-1]*dp[i-j](二叉搜索树的特性,左边有j-1个数,右边有i-j个数)dp[i][j]表示任意取物品0-i之间当书包容量为j时的最大价值。初始化:dp[0]、dp[1]没有意义、赋值为0;i从1开始遍历,j从1开始遍历,如果j大于物品i的重量,那么。dp想对了,dp[i]就是头节点为i的搜索树有几种情况。
2024-07-16 19:09:36
174
原创 968||动态规划509||70||746||62||63
在边缘有障碍时,从有障碍那一个格子开始后面全为0;在非边缘有障碍时,dp[i][j]保持0不变。递推关系:dp[i][j]=dp[i-1][j]+dp[i][j-1];初始化:第0排为1,第0列为1.因为第0排和第0列无法用递归公式推导出来。首先是定义三种状态,状态0是无覆盖,状态1是有摄像头,状态2是有覆盖。使用后序遍历,如果两个叶子节点都是2,那么根节点就是0。如果其中一个叶子节点有摄像头1,那么根节点就是2。dp的意义是到达dp[i][j]的位置总共有几条。dp:是爬上i要花费的最小值。
2024-07-15 20:22:26
159
原创 452||435||763||56||738
2、如果两个相邻两个区间没有重叠的部分,建树加1,具体有前一个区间的右边界和当前区间的左边界进行比较;否则就是有重叠,这时候更新当前区间的右边界,即取前一个区间和当前区间右边界最小值。2、更新左右区间,右区间=max(right,hash[s[i]-‘a’]),当right==i时,计算该区间长度,更新left=right+1;1、记录每个字母出现的最远位置,用一个for循环就能实现,就是hash[s[i]-‘a’]=i。修改思想就是,如果前一位比后一位大,就将前一位-1,后一位变成9。
2024-07-13 18:03:48
190
原创 122||55||45
先记录一下当前我在这个位置能跳的最远距离,这个算一步,然后当我跳到最远距离的时候看是否是最后一个位置,如果不是,那么我要更新最远距离,怎么更新呢,其实就是再加一步,跳到下一个格子,更新最远距离,如果我的最远距离涵盖了最后一个位置,这时候就可以返回步数了。变成cover,就是看cover能不能到数组的最后一个位置。那么我就会第三天-第一天=第三天-第二天+第二天-第一天。就变成每天的利润了,前提是每一天的股价要大于前一天的股价。比如说我第一天买,第三天卖是赚的。核心思想就是有赚我才会买卖。
2024-07-10 21:03:42
157
原创 51||37
用两个for循环取递归遍历,第一个是行,第二个是列,然后递归的时候又有一个for循环遍历k从0到9。在递归中,如果有哪个k符合条件就返回true,如果在单层递归遍历中,都没有k符合条件,那么返回false。在判断是否满足条件时,要求行不重复,列不重复,画粗线的9宫格里不重复。针对最后一个判断条件,用startrow=(row/3)*3来求k所在的第(k/3)个九宫格的起始行数,起始列数同理。首先是不能同行,然后不能同列,斜45和135不能有,这个判断条件要注意,差点写错了。把这个问题简化为一颗树。
2024-07-09 14:37:37
183
原创 491||46||47
和上一题一样,不同的是要加一个if判断条件,即i>0&&nums[i-1]==nums[i]&&used[i-1]==0,含义是存在相同元素,并且第一个元素已经被用了(如果used[i-1]==1说明正在被用,那么nums[i-1]和nums[i]的关系是树枝的关系,不是树层)因为数组不大,所以直接用一个向量used来记录数组中每个元素被用了没,被用了就true,在遍历之前先判断当前元素是否为true,如果是就continue,如果不是就继续遍历。在回溯之后,记得把当前元素的状态改为false;
2024-07-03 15:26:07
229
原创 复习数组704||27||977||59
笔试常考的题目,我觉得就是找到思路,代码实现不难。首先是确定绕圈的圈数n/2,这时候要判断如果n为奇数,那么中间的位置填的就是最大的值。在单圈中,坚持左闭右开的原则,每一条边的最后一个数字不遍历,这时候难点就是边界条件。注意:如果是等于的话,前面的数据也要移到后面去!否则会导致缺少一部分情况,计算超时。而l=mid+1或者r=mid-1 具体看是在哪个区间遍历。核心:更新mid,目的是为了更新left和right。
2024-07-02 14:22:37
223
原创 209||17||39||216||131
1、终止条件:就是隔板已经放到了最后面,可以把path推入到result里,我本来想的是要在这里判断是不是回文子串,但是如果把这个判断放在单层逻辑里,可以直接continue,就不用遍历剩下的情况,更快。要在树层的时候加一个判断:就是当i>index(也就是该数层的第一个元素已经被用了)并且(数组[i]==数组[i-1](前一个元素等于当前元素)的时候直接continue,不进行组合了;2、第二层遍历,因为题目说不要重复元素,所以你遍历完第一个元素的组合后,第二个元素的组合就不要再次考虑第一个元素了。
2024-07-02 11:22:09
264
原创 669||108||538||704||27||977
1)判断是否小于low,若小于,把左子树剪切,但是右子树再次进入递归里裁剪,而不是将整个右子树返回,因为右子树里有不满足条件的。2)判断是否大于hight,若大于,把右子树剪切,左子树进入递归里裁剪。我觉得我递归来递归去有点头晕,做不出全部。3、左子树=递归返回;1、终止条件:遇到空值返回空值。
2024-06-27 10:37:31
107
原创 刷题0626
卡尔:利用二叉搜索树的特性(有序排列),如果当前节点值均大于p和q,就说明祖先在左边,为啥呢,因为如果再往右就会错过p和q;1)当前值比val大,就向左递归,当遍历到为空时,插入新节点,同时root->left此时为空,那么就让root->left等于返回的新节点,就能建立联系了。2)如果当前节点值均小于p和q,说明祖先在右边,往右边遍历,如果右边返回不为空,说明右边有最近祖先,返回右边。1)如果当前节点值均大于p和q,就说明祖先在左边,往左边遍历,如果左边不为空,说明左边有最近祖先,返回左边。
2024-06-26 16:52:59
238
原创 0625刷题
2)如果count>maxcount,那么maxcount=count,把之前存的result清空,因为是假的众数,然后再推进现在的节点值,这才是真的众数。1)更新maxcount:如果count==maxcount,则把数据推进result;2、求最小绝对值误差:有序数组中,相邻数字的绝对值误差是任意两个数字绝对值误差中最小的。1、将二叉树的节点值存入数组:传入递归函数为节点和数组,不输出。2)递归顺序:中序遍历,记住,函数不返回,并且需要传入数组。1)结束条件:遍历到空节点,返回。
2024-06-25 18:47:20
180
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅