- 博客(26)
- 收藏
- 关注
原创 2021 MIT6.S081 LAB9 file system Large files Symbolic links
实验九原网址 Lab: file systemLarge files这个实验的目标是增加一个文件的最大容量,原来的字节数是(256+12)* 1024,有12个直接引用块1个1级间接引用块,这一个间接引用块有256个直接引用块。将12个直接引用腾出一个位置,作为一个2级间接引用,所以,腾出来后,有(256*256 + 256 + 11)个块。修改宏定义NDIRECT、最大文件MAXFIEL以及相关结构体,增加新宏定义DOUBLE_INDIRECT。修改NDIRECT为11后,结构体din
2021-12-26 09:47:06
519
1
原创 2021 MIT6.S081 LAB6 Multithreading
实验六原网址 Lab: MultithreadingUthread: switching between threads实现线程切换时,寄存器的保存与恢复。保存切出去的线程的寄存器,恢复切进来的线程的寄存器uthread_switch.S中的汇编代码实现寄存器的保存与恢复,与内核中swtch.S类似,但是要保存的寄存器没内核的那么多,起初我用内核的struct context保存寄存器是可以的,后来发现uthread.asm中的汇编代码用到的寄存器有s0-s4,改了之后发现也行。thre
2021-12-13 11:21:45
628
原创 2021 MIT6.S081 LAB4 backtrace alarm
实验四原网址 Lab: trapsRISCV-V assemblyWhich registers contain arguments to functions? For example, which register holds 13 in main's call to printf?call.asm中地址0x24的指令将13放在了a2Where is the call to function f in the assembly code for main? Where is t
2021-12-04 14:22:12
455
原创 2021 MIT6.S081 LAB3
实验三原实验网址:Lab: page tablesSpeed up system calls操作系统通过在用户空间和内核之间的共享只读区中的数据来加速某些系统调用。这种做法可以消除用户态到内核态之间切换的消耗。这次实验就使让我们学会将映射插入页表中,我们的第一个任务就是实现对系统调用getpid()的优化。当一个进程被创建的时候,映射一个只读页到虚拟地址USYSCALL(定义在memlayout.h中)。在该页的开始存放一个结构体,初始化这个结构体,结构体的只有一个成员,初始化为当前进程的pi
2021-11-30 09:33:14
2482
原创 2021 MIT6.S081 LAB2
实验二原实验网址 Lab: system callstracetrace命令可以用来查询一个程序是否使用了某些系统调用,这些系统调用通过参数mask来设置。例如,read的系统调用号是5,通过使用命令 trace 32 grep hello README,来查看grep命令是否使用系统调用read,32 = 1 << 5。这个mask掩码可以是系统调用号的集合,在某一位上为1,就说明需要判断有没有这个系统调用,例如上面的read,mask二进制位上从右往左第五位应该置为1;同时,
2021-11-25 19:12:38
857
3
原创 2021 MIT6.S081 LAB1
实验一原实验网址:Lab:Xv6 and Unix utilitiessleep(easy)为xv6实现UNIX下的sleep指令,你的sleep指令应该暂停一定的tick数,该数由用户指定。tick是由xv6定义的时间概念,即定时器芯片两个中断间的经过的时间。你的代码应该放在user/sleep.c文件下提示写代码前,阅读vx6 book书中第一章代码看看其他程序(user/echo.c user/grep.c user/rm.c)是怎样获取命令行参数的如果用户使用sleep
2021-11-22 14:25:46
1300
原创 LeetCode 338. 比特位计数 C++ 位运算
338. 比特位计数给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。示例 1:输入:n = 2输出:[0,1,1]解释:0 --> 01 --> 12 --> 10示例 2:输入:n = 5输出:[0,1,1,2,1,2]解释:0 --> 01 --> 12 --> 103 --> 114 --> 1005
2021-09-12 14:02:01
343
原创 LeetCode 134. 加油站 C++ 贪心 模拟
134. 加油站在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明:如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为非负数。示例 1:输入: gas = [1,2,3,4,5]cost = [3,4
2021-09-12 13:46:03
117
原创 LeetCode 120. 三角形最小路径和 C++ 自底向上更新和自顶向下更新
120. 三角形最小路径和给定一个三角形 triangle ,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。示例 1:输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]输出:11解释:如下面简图所示: 2 3 4 6 5 74 1 8
2021-09-12 12:32:36
98
原创 LeetCode 75. 颜色分类 C++ 双指针
75. 颜色分类给定一个包含红色、白色和蓝色,一共 n 个元素的数组,**原地**对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。示例 1:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]示例 2:输入:nums = [2,0,1]输出:[0,1,2]示例 3:输入:nums = [0]输出:[0]思路:要排序的只有三种数字,0,1,2。因此考虑用双指针,最大
2021-09-12 11:24:06
95
原创 LeetCode 63. 不同路径 II C++
LeetCode 63. 不同路径 II一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。示例 1:输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]输出:2解释:3x3 网格的正中间有一个障碍物。
2021-09-12 10:27:37
203
原创 LeetCode 394.字符串解码
394. 字符串解码给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例 1:输入:s = "3[a]2[bc]"输出:"aaabcbc"示例
2021-09-12 10:00:06
80
原创 LeetCode 146. LRU 缓存机制
146. LRU 缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它
2021-09-12 09:17:06
90
原创 并查集 DFS 被围绕的区域 C++
被围绕的区域LeetCode 被围绕的区域深度优先搜索位于边界上的’O’和与其相连的’O’不算被包围。首先,把和边界连接的’O’通过深度优先搜索,换成‘1’或者其他非’X’和‘O’的字符。接下来,一个字符一个字符遍历,把’1’变为’O’,把‘O‘变为’X‘即可。class Solution { private: void DFS(vector<vector<char>>&board,int row,int col) { if (ro
2021-08-08 15:02:10
243
原创 C++二叉树的前序、中序、后续遍历 递归 迭代 Morris遍历
二叉树的前序遍历LeetCode 144. 二叉树的前序遍历递归class Solution {private: vector<int>ret;public: vector<int> preorderTraversal(TreeNode* root) { _preorderTraversal(root); return ret; } void _preorderTraversal(TreeNode* root)
2021-07-31 21:58:21
180
原创 蓄水池算法 链表的随机节点 随机数索引 C++
蓄水池算法问题描述:1.从10000个编号为1-10000的人中随机抽100个调查2.从80亿个编号为1-80亿的人中随机抽取100个调查对于第一个问题,可以把10000个人的信息读取到数组中,调用库函数rand(),随机访问。第二个问题也可以读取到数组中,显然,这种方法不可取。问题描述:要求从N个元素中随机的抽取k个元素,其中N无法确定。问题定义可以简化如下:在不知道文件总行数的情况下,如何从文件中随机的抽取一行?给出解决方案:在扫描第i个行时,以1/i的概率选择该行,选择意味着选取当
2021-07-30 17:58:53
115
原创 最长回文串 马拉车算法 C++
最长回文串LeetCode 5.最长回文串给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。示例 2:输入:s = “cbbd”输出:“bb”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-palindromic-substring解法一:暴力枚举把字符串中所有是回文串的子串都挨个遍历一遍,记录下最长回文串的长度和起始
2021-07-25 16:41:16
247
原创 浅尝KMP算法 C++ strStr()
实现strStrLeetCode 28.实现strStr()给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。示例 1:输入:haystack = “hello”, needle = “ll”输出:2示例 2:输入:haystack = “aaaaa”, needle = “bba”输出:-1来源:力扣(LeetCode)链接:https://leetco
2021-07-25 10:57:51
172
原创 反转链表 C++ 迭代 递归
反转链表LeeCode206.反转链表给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。解法一:迭代prev指向前一个节点,初始化为nullptr,使链表第一个节点指向nullptr。cur指向当前正在遍历的节点,每次都使cur->next指向prev,然后prev指向cur。在此之前,要保存cur->next,用tmp保存,最后,cur指向tmp。class Solution {public: ListNode* reverseList(ListNod
2021-07-23 21:09:33
942
原创 合并两个有序链表 C/C++两种解法
合并两个有序链表LeetCode21.合并两个有序链表将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]解法一:迭代合并前:合并后:class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { //不排除其中有一条链是空链的可能,
2021-07-23 20:20:24
1820
原创 区域和检索 树状数组C++
区域和检索 树状数组LeetCode307. 区域和检索 - 数组可修改假设有一个长度为9的数组,数组中的值arr[i],前i个的总和sum[i]如下。某次,arr[3]修改为0,那么有6个数据需要更新,查询前5个的总和为sum[4] = 11某次,arr[0]修改为3,那么有9个数据需要更新,查询前5个的总和为sum[4] = 13有n个数,第i个修改了,那么sum(i)到sum(n-1)需要更新,n为数组长度树状数组lowbit (x)= x & (-x)取x在二进制中的最后
2021-07-23 09:09:55
93
原创 LeetCode 37.解数独
解数独LeetCode 37.解数独解法一纯暴力方法,未做任何优化class Solution {private: bool is_valid_place(vector<vector<char>>& board, int x, int y, char ch) { //行或者列放入字符ch是否有效 for (int i = 0; i < 9; i++) { if (board[x][i] == ch
2021-07-13 20:48:10
64
原创 C语言中的结构体、联合、枚举
结构体含义:聚合数据类型,能够同时存储超过一个的单独数据。结构体是一些值的集合,这些值称为成员,成员可以是不同的数据类型。定义结构体//头部定义struct TypeName{ 类型 成员; ...;};//尾部定义,也叫匿名结构体struct{ 类型 成员; ....;} Name = {val1,val2,val3};//错误示例//在C++中正确,C中错误//在定义结构体时,未创建对象,没有给结构体分配内存,因此没有空间赋值。struct
2021-07-13 19:08:30
102
原创 C++ N皇后 位运算
N皇后51.N皇后解法一四个方向上的判断,递归每一层,其实可以省去横向的判断横向纵向斜对角线ld,左上到右下斜对角线rd,右上到左下对角线rd有如下性质:行号加列号相等对角线的数量为2 * N - 1 0 1 2 3 0 O X O O 1 X O O O 2 O O O O 3 O O O O 对角线ld有如下性质:行号与列号之差的绝对值相等,用行号与列号之差加上N-1即可补偿,使之从 [-(
2021-07-11 15:24:01
322
原创 N皇后II C++ 集合 位运算
N皇后IIleetcode 52.N皇后II1.解法一判断一个位置是否有效主要依据以下四点,第一点其实可以不用判断每一行上,皇后是否出现一次以上每一列上,皇后是否出现一次以上每一斜对角线(从左上到右下),****每一斜对角线(从右上到左下),****因此,可用四个数组,存储以上四种情况,N个皇后vectorr(n,false)vectorc(n,false)vectorld(2 * n + 1,false)vectorrd(2 * n + 1,false)而ld有
2021-07-11 14:03:42
189
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人