【转载】正则表达式不会用?记不住?10分钟动手全部搞懂
文章出处是贝贝贝贝贝波a 正文开始正则表达式对于我们来说既熟悉又陌生,我们在很多时候都遇到过,但是学起来又很难记,不好理解;在没有接触正则表达式的时候,我就在想这一串奇怪的字符为啥可以代替其他很长的一段代码就可以得到预期值,去网上找资料和技术文章学习的时候,发现有很多知识点晦涩难懂;下面我将用非常通俗易懂的方法和大家一起学习正则表达式。 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。 首先我们要在网页编译器 regular expression 101 在线编译里自己动手跟着操作一遍就会发现其实没有那么难理解。(一定要实际动手操作加深记忆) 一、基础字符接下来一起操作一遍:(默认选中颜色表示符合条件) 1. +号表示前边的字符必须至少出现一次(1次或多次); 2.* 表示前边的字符可以不出现,或者出现一次或者多次(0次、或1次、或多次) 3.?号表示前面的字符最多只可以出现一次(0次或1次) 4.{}号:还是上边 ...
一文讲明白优先级队列为啥按less排序却是从大到小(转载)
文章出处牛客网-wayneYM 一文讲明白优先级队列为啥按less排序却是从大到小写在前面: 如果你一直纠结为啥自定义明明是greater<>但是出堆却是从小到大,看完这篇文章你就懂了! 优先级队列 Priority_queue这是一个拥有权值queue,其内部元素按照元素的权值排列。权值较高者排在最前优先出队。其中缺省情况下系统是通过一个max-heap以堆实现完成排序特性,表现为一个以vector表现的完全二叉树。 定义priority_queue<Type, Container, Functional> 其中Type代表数据类型,Container代表容器类型,缺省状态为vector; Function是比较方式,默认采用的是大顶堆(less<>)。 //升序队列 小顶堆 great 小到大priority_queue <int,vector,greater > pq;//降序队列 大顶堆 less 大到小 默认priority_queue <int,vector,less &g ...
这个分类下的文章都是做什么的?
这个分类下的文章都是做什么的?在学习过程中,我遇到不会的问题经常会去查找别人的博客进行学习。有时候别人的博客已经讲解地非常清楚了,我懒得自己再写一篇新笔记,但是我又害怕笔记之后由于各种原因会失效,所以这个分类下的文章就是我用来保存别人笔记,方便我自己之后查看用的。不过我这个博客只有我自己在看,应该不会对大佬们产生什么影响。
二分查找的边界问题
在准备机试的时候(2025年03月14日),遇到这道题,第一次没想出来解答,于是查看了官方的解法。本人想举一反三,将代码进行修改,却发现了原解没遇见的边界问题。,现分析为什么原代码可以,现在的代码不行 原题题目链接已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2] 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7] 注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。 给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。 你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。 思路本体的思路我学习的官方题解,思路也搬运过来 方法:二分查找 思路与算法 一个不包含重复元素的升序 ...
二叉树的前中后三序遍历
前序遍历二叉树结构 -前序遍历结果:1-2-4-5-6-7-3-8-9 递归遍历12345void pre(TreeNode* root,vector<int> &res){ res.push_back(root->val); pre(root->left,res); pre(root->right,res);} 迭代(非递归)遍历思路一:步骤(思路): 1. 沿着根的左孩子,依次入栈并访问,直到左孩子为空 2. 栈顶元素出栈: 若其右孩子为空,继续步骤2; 若右孩子不空,将右子树执行步骤1. 1234567891011121314151617181920212223242526272829vector<int> preorderTraversal(TreeNode* root) { if(!root) return {}; vector<int> res; ...
MIT6.S081_2020_Lab6:Copy-on-Write
一、什么是copy-on write(写时复制)?xv6中的fork()系统调用将父进程的所有用户空间内存复制到子进程中*(同样linux 中除pid=1的进程外所有的进程都是fork出来的)*。如果父进程较大,则复制可能需要很长时间。更糟糕的是,这项工作经常造成大量浪费;例如,子进程中的fork()后跟exec()将导致子进程丢弃复制的内存,而其中的大部分可能都从未使用过。另一方面,如果父子进程都使用一个页面,并且其中一个或两个对该页面有写操作,则确实需要复制。 copy-on-write (COW) 的目标是推迟到子进程实际需要物理内存拷贝时再进行分配和复制物理内存页面。 COW只为子进程创建一个页表,用户内存的PTE指向父进程的物理页。COW将父进程和子进程中的所有用户PTE标记为不可写。当任一进程试图写入其中一个COW页时,CPU将强制产生页面错误(page fault)。内核页面错误处理程序检测到这种情况将为出错进程分配一页物理内存,将原始页复制到新页中,并修改出错进程中的相关PTE指向新的页面,将PTE标记为可写。当页面错误处理程序返回时,用户进程将能够写入其页面副本。 C ...
MIT6.S081_2020_Lab6:init-starting-sh-bug-原因分析
一、BUG的表现在Lab 6 实验中,遇见了这个现象 只要按下回车,就会输出init: starting sh,这个BUG看起来很有意思。 二、结论先说结论:该BUG的产生原因:在之前lab5 实验时,usertest中存有一项测试stacktest报错: stacktest源代码如下: 123456789101112131415161718192021222324252627// user/usertests.c// check that there's an invalid page beneath// the user stack, to catch stack overflow.voidstacktest(char *s){ int pid; int xstatus; pid = fork(); if(pid == 0) { char *sp = (char *) r_sp(); sp -= PGSIZE; // the *sp should cause a trap. printf("%s: ...
MIT6.S081_2020_Lab5:LazyPageAllocation
一、什么是惰性分配(lazy page allocation)?1.eager allocationsbrk是xv6提供的系统调用,使得用户应用程序能扩大自己的heap。当一个应用程序启动的时候,PAGESIZE为heap的最底端,同时也是stack的最顶端。这个位置通过代表进程的数据结构中的sz字段表示,这里以*p->sz表示*。 当调用sbrk时,它的参数是整数,代表了你想要申请的字节数. 这意味着,当sbrk实际发生或者被调用的时候,内核会分配一些物理内存,并将这些内存映射到用户应用程序的地址空间,然后将内存内容初始化为0,再返回sbrk系统调用。这样,应用程序可以通过多次sbrk系统调用来增加它所需要的内存。类似的,应用程序还可以通过给sbrk传入负数作为参数,来减少或者压缩它的地址空间。 在XV6中,**sbrk的实现默认是eager allocation。这表示了,一旦调用了sbrk,内核会立即分配**应用程序所需要的物理内存。但是实际上,对于应用程序来说很难预测自己需要多少内存,所以通常来说,应用程序倾向于申请多于自己所需要的内存。这意味着,进程的内存消耗会增加 ...
MIT6.S081中Systemcall的调用流程
前言MIT6.S081 项目中的许多实验都涉及到了系统调用(System Call)的使用,我在实验过程中往往依葫芦画瓢在原有的System Call基础上使用,没有真正理解System Call的流程,本篇笔记打算以sys_sleep为例子梳理一下Xv6系统中 System Call的调用流程。 一、用户态(/user/)中的系统调用我们可以在/user/user.h中找到sleep函数的函数声明,却无法找到sleep函数的函数定义。 实际上我们可以在user/usys.pl中找到除了函数调用以外sleep函数的出现, 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748// user/usys.pl#!/usr/bin/perl -w# Generate usys.S, the stubs for syscalls.print "# generated by usys.pl - do not edit\n";print & ...
MIT6.S081_2020_Lab3:page tables
实验要求 前言本来想把MIT6.S081的每个lab都做一个总结,后来发现单单做一个lab3就已经很费力气,后续打算只将较难的实验总结出来 一、理清实验的目的:原本的流程存在什么问题?我们为什么要这样做?虚拟地址(virtual address -va)到物理地址(physical address-pa)的转化需要借助MMU(内存管理单元MMU,Memory Management Unit),XV6 中MMU可以将satp中装载的内核页表上的虚拟地址转化为物理地址。 Xv6为每个进程维护一个页表,用以描述每个进程的用户地址空间(pagetable);外加一个单独描述内核地址空间的页表(kernel_pagetable)(该页表始终在satp中装载)。 这种构造导致kernel_pagetable中没有存储 单一进程的虚拟地址与物理地址的映射关系,MMU无法根据给出的虚拟地址来直接得到对应的物理地址。 1.xv6对待用户地址传来的虚拟地址采用间接查询的方法来查询对应物理地址这种方法的实现关键XV6采用的 虚拟地址与物理地址的映射关系 与 walk函数(kernel/vm.c) ...








