- 博客(765)
- 资源 (33)
- 问答 (12)
- 收藏
- 关注
原创 C++链表那些事儿
从一个数组里面取元素返回链表,如果数组是空返回空指针,不带头节点的,意味着第一个元素需要放到head指针里面去,然后从第二个元素开始放到链表尾,不断更新链表尾。访问链表,如果链表是空的直接返回,输出当前节点的值,更新当前节点。
2024-11-06 00:14:34 912
原创 Go并发多协程顺序打印
启动三个协程分别打印1、2、3,要求按照123123123123……的顺序打印出来,可以使用锁或者通道实现。也可以用通道实现,channel分为有缓冲和无缓冲,内部封装了锁,读写通道是原子性的;有缓冲通道:发送会在缓冲区未满时不阻塞,在缓冲区满时阻塞。无缓冲通道 :发送和接收都会阻塞,直到被接收或者通道有值。
2024-10-25 14:39:20 512
原创 32位机器和64位机器的32和64具体指的是什么的长度
32位和64位表示的是CPU的架构,32位和64位具体指的是CPU寄存器的大小(bit)、数据总线的长度(bit)、内存地址的长度(bit),由此带来32位的寻址空间只有2^32字节≈4GB。与CPU架构对应的有32位操作系统和64位操作系统,一般64位的操作系统可以运行32位的应用程序,反之则不行。与此对应的数据类型长度问题,32位机器的类型一般是32位的,如普通整型、浮点型。在一些编程语言当中,uint、int的长度是随系统变化的。
2024-10-19 11:02:36 394
原创 常见图片格式区别
适用场景:适合于存储摄影图片和复杂的图像,例如自然风景和人像,通常用于网页、社交媒体和数字摄影。适用场景:主要用于Windows系统的图像处理,适合需要高质量的图像。特点:支持动画和透明背景,采用无损压缩,但颜色限制在256种。特点:支持多种色彩空间,适合高质量图像存储,可以是无损或有损。特点:谷歌开发的格式,支持有损和无损压缩,支持透明度和动画。适用场景:优化网页图像,减小文件大小,同时保持质量。特点:一种新型图像格式,提供更好的压缩比和图像质量。特点:一种无损格式,存储每个像素的数据,不压缩。
2024-10-05 19:52:37 375
原创 C++如何从字符串中提取数组
用stringstream将字符串变成流,然后用getline从流中读取字符串直到遇到逗号或者回车,再将字符串变成数字即可。假设字符串中数字是以逗号隔开的:1,2,3,4,5,6,7,8。
2024-09-14 17:38:10 275
原创 IO多路复用的Linux内核原理
IO 多路复用是一种同步IO模型,一个线程可以监视多个文件句柄,一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作,没有文件句柄就绪就会阻塞应用程序交出CPU无需为每个IO操作创建一个线程或进程,没有线程切换的开销。
2024-09-10 16:59:58 350
原创 share_ptr循环引用
此时这两个share指针的引用计数都是2,当node超过生命周期被析构时,node的引用计数变成1,不为0,那么node指向的类实例不会被析构,注意智能指针也是一个类,智能指针的析构和它指向的类实例的析构是两回事,程序中Node实例没有被析构导致p也不会析构。定义一个类,这个类有一个share指针变量,创建一个share指针指向这个类实例,然后将类实例的成员变量share指针也指向这个类实例。用weak指针解决循环引用问题,weak只引用资源不增加资源引用的计数。
2024-07-06 23:25:03 563
原创 用数组实现堆
实现堆关键在于堆调整,堆有向上调整和向下调整,当pop堆顶元素的时候是弹出数组里面最小的元素,这个时候需要向下调整堆,把堆顶元素的值更新为数组末尾元素的值,然后从堆顶开始向下调整堆。从树根节点开始,找出左右子树中比自己更小的节点,交换值,然后从交换后的节点处继续往下寻找更小的节点,直到堆末尾或者没有更小的。向上调整堆先找出当前节点的父节点,如果父节点是更大的节点,那么交换值后往上走,继续向上寻找更大的节点。push元素的时候先放到数组末尾,然后看看容量是不是满了,增长一下容量,开始从数组末尾向上调整堆。
2024-07-06 15:34:31 421
原创 用数组实现队列
队列用链表实现很简单,记住链表头和链表尾就行了,每次push就往头插入,每次pop就删掉尾巴。我们这里用数组实现一下队列,基本思想是一个循环滑动的窗口,用两个变量记录队首和队尾索引。这里比较难的是队列容量的动态增长,申请两倍的容量后,从队首索引开始拷贝。push放到队尾,pop放到队首,队尾索引和队首索引都需要循环。
2024-07-05 20:35:54 183 1
原创 用数组实现栈
为了栈容量动态增长,写一个成长函数,将容量翻倍,即申请一块新内存,将原来元素拷贝过去,释放掉原来的空间。这里用数组实现,需要三个成员变量,分别记录栈容量、栈顶索引(栈元素数量)、数组首地址。push的时候直接放到栈顶位置,然后栈顶移动,判断元素是否满了,满了就增长栈容量。pop的时候先看看栈是不是空的,不是空的就移动栈顶,返回栈顶元素。链表实现的话,push就往头节点插入,pop就删除头节点。如此一来top实际上是栈元素的个数。栈的实现可以用链表或者数组实现。
2024-07-05 15:52:04 423 1
原创 如何写一个死锁
设置两个全局变量当作线程共享资源,为了让两个线程分别持有一个资源让它们抢到一个资源后睡一会让另一个抢。最简单的死锁,线程x持有资源a请求资源b,线程y持有资源b请求资源a,死锁了。等同于这个代码,刚刚的代码相当于实现了一个自旋锁,下面这个是互斥锁。死锁就是多个进程或者线程竞争临界资源所造成的僵局。只需要把它们请求资源的顺序改成相同就不会死锁了。
2024-07-05 00:37:12 245 1
原创 Ubuntu换源
dd可以删除整行,把整个配置文件的内容全部删掉,你也可以在删除之前备份一下,然后把刚刚copy的配置内容复制到这里来。根据发行版本找到对应的配置文件copy起来。查看发行版本,记下来。
2024-06-22 11:51:18 438
原创 xv6 qemu 卡在Booting from Hard Disk...
定位到xv6目录下的kernel.ld的第25行。.stab:{ 修改成。
2024-06-21 13:06:37 433 1
原创 环形buffer单生产单消费队列
使用两个循环指针用来实现环形队列,头指针和尾指针在队列为空的时候是相同的,起始为0,当头指针快追上尾指针的时候代表队列已满,也就是head=tail-1的时候,这意味着我们使用了一个元素的位置来表示队列是否满,环形buffer实际容量为数组长度减去一个单位。环形缓冲区由一个固定大小的数组构成,生产者将数据写入缓冲区的尾部,而消费者则从缓冲区的头部读取数据,当缓冲区被填满时,生产者会等待,直到有空间可用;生产即入队,元素安排在头指针处,之后头指针移动,消费即出队,取尾指针处元素后移动尾指针。
2024-06-12 16:56:08 235
原创 非递归式实现快速排序
快速排序基本思想是寻找一个元素作为基准,将其他元素划分为两部分,其中一部分比基准元素小,另一部分比基准元素大,然后如此继续对这两部分操作下去快速排序最简单的实现就是通过简单的递归,实现方式之一是使用双指针,两个指针同时走,左指针找到大的,右指针找到小的,然后交换这两个元素的位置,问题在于枢纽元素和谁交换,让右指针先走,两个指针走到相同位置的时候必然是右指针走到左指针的地方了,而左指针指向的元素是刚刚交换完比枢纽元素小的,而枢纽元素选的是第一个,因此它们进行位置交换就是正确的这里给出C版本,C++版本一般是将
2024-06-12 16:28:10 476
原创 【LeetCode】使括号有效的最少添加
括号离不开栈,栈可以消除有效的括号,先用栈将左括号装起来,遇到右括号并且栈非空就弹栈,如果遇到右括号栈空就计数,说明需要插入左括号,完事之后栈里面的元素就都是左括号,都计数,因为都需要加上右括号。对于一个只有()组合的括号字符串,如果想要这个字符串是有效的括号对,找出最少需要插入多少个括号。
2024-06-04 16:07:43 398
原创 WSL2修改CPU核数
先关闭所有wsl终端,远程连接开发的IDE也需要关闭,因为工具链开着给你wsl没有完全关闭,在Windows的power shell终端命令行窗口可以实验以下命令检查是否wsl已经关闭。然后文件内容复制下面信息,CPU核数为processors,修改即可,在确认所有Linux子系统已经关闭的情况下,保存文件重启wsl即可。创建文件C:\Users\\.wslconfig,目录必须对,例如C:\Users\Yezi。查看LinuxCPU核数。
2024-05-27 16:31:17 1240
原创 C++实现的单例模式日志类
自己实现的话, 日志内容应该包括,精确到微秒的时间戳,日志级别(DEBUG / INFO / WARN / ERROR / FATAL),日志写入时的代码文件名,代码行号和函数名,例如。这意味着我们需要一个单例模式的实现,需要将类实例静态化,由一个静态函数返回类实例的引用,由于静态变量只会初始化一次,所以每次返回的都是同一个实例。同时我们希望能够保留可以更改类实例初始化的参数,例如日志文件名,因此需要一个初始化的静态函数来进行类实例的初始化。并且我希望日志是这样使用的。代码维护在GitHub。
2024-05-26 00:04:15 349
原创 C++实现的代码行数统计器
思路比较简单,主要是用到了C++17的filesystem库用来解析目录和提取文件后缀,如果路径是个目录就提取子目录项逐个分析,如果子目录项是目录就递归调用本身继续解析目录,如果是代码文件就开始计数行数。前段时间到处面试找实习,有技术负责人的负责人问我C++写过多少行,5万还是10万,用来评估熟练度,有点难顶,于是写个代码统计器吧,输入文件夹目录或者代码文件,可以统计所有代码的行数。可以直接编译代码运行程序,在控制台输入目录的路径按下回车即可,例如输入。
2024-05-25 22:23:54 874
原创 C/C++ epoll实例
IO多路复用通常用于处理单进程高并发,在Linux中,一切皆文件,一个socket连接会对应一个文件描述符,在监听多个文件描述符的状态应用中epoll相对于select和poll效率更高。epoll本质是系统在内核维护了一颗红黑树,监听的文件描述符会作为新的节点插入红黑树,epoll会等待有状态变化的节点记录在链表里,然后拷贝到用户所给的数组里面返回出来。简单测试服务端,打开Linux终端,用一下命令连接服务器后即可传输数据。以下是一个独立的服务端代码,可以补充业务代码进行具体使用。
2024-05-25 22:04:52 638
原创 【LeetCode】【滑动窗口】【双指针】长度最小的子数组
腾讯微信搜索团队一面的题,一模一样,用两个指针记录滑动窗口的头和尾巴,sum记录和,当sum大于等于target的时候,记录最小长度,将滑动窗口缩短至sum小于target。如果不存在符合条件的子数组,返回。找出该数组中满足其总和大于等于。个正整数的数组和一个正整数。
2024-05-14 21:34:33 190
原创 【华为机考模拟题】Words、Vowel、计算字符串重新排列数
他在写日记的时候都会把元音字母写成大写的,辅音字母则都写成小写,虽然别人看起来很别扭,但是 solo 却非常熟练。你试试把一个句子翻译成 solo 写日记的习惯吧。给定一个只包含大写英文字母的字符串 S,要求给出对 S 重新排列的所有不相同的排列数。每个句子由多个单词组成,句子中的每个单词的长度都可能不一样,假设每个单词的长度。如:S 为 ABA,则不同的排列有 ABA、AAB、BAA 三种。为该单词的重量,你需要做的就是给出整个句子的平均重量。是元音字母的变成大写,其他的变成小写。
2024-05-07 16:19:35 648
原创 【LeetCode热题100】【多维动态规划】编辑距离
要么替换,需要将word1[0:i-2]转换成word2[0:j-2],即dp[i][j]=dp[i-1][j-1]+1。要么插入,需要将word1[0:i-1]转换成word2[0:j-2],即dp[i][j]=dp[i][j-1]+1。要么删除,需要将word1[0:i-2]转换成word2[0:j-1],即dp[i][j]=dp[i-1][j]+1。定义dp[i][j]是将word1[0:i-1]转换成word2[0:j-1]所使用的最少操作数。你可以插入、删除、替换字符。
2024-04-23 20:26:01 392
原创 【LeetCode热题100】【多维动态规划】最长回文子串
用一个二维布尔数组dp,dp[i][j]表示字符串s[i,j]是不是回文字符串,取决于s[i]是否等于s[j]并且dp[i+1][j-1]为真或者i和j之间没有或者只有一个字符。如果暴力的话,两层循环找出所有子串,一层循环判断回文,这样重复判断了回文,存在这样的一个事实:如果s[i,j]是回文字符串,那么s[i+1,j-1]也是回文字符串。二维动态规划数组,由于dp[i][j]需要dp[i+1][j-1],所以需要从左下角开始往右上角遍历。
2024-04-23 16:45:23 486
原创 【LeetCode热题100】【多维动态规划】最小路径和
经典动态规划问题,到达当前格子的路径和要么是加上从上面格子来的,要么是加上左边格子来的,取这两个方向来的较小者就行了。,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。对于最左边的和最上边的没有两个方向,可以直接累加一个方向的。每次只能向下或者向右移动一步。给定一个包含非负整数的。
2024-04-23 16:03:25 291
原创 【LeetCode热题100】【多维动态规划】不同路径
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?经典动态规划问题,当前格子的路径数等于上方格子的路径数加上左边格子的路径数,最左边一束和最上边一横路径数都是1。网格的左上角 (起始点在下图中标记为 “Start” )。
2024-04-23 15:52:21 403
原创 【LeetCode热题100】【链表】合并 K 个升序链表
合并k个有序链表同样的思路,先循环找出k个链表里面最小的节点,把这个节点当成头节点,同时更新节点原来的链表的头节点为后一个节点,递归合并新的k个链表。合并两个有序链表是找出较小的节点放在前面,更新节点原来的链表的头节点为后一个节点,递归合并新的两个有序链表。要合并k个有序链表,其实和合并两个有序链表是一样的。
2024-04-22 16:54:09 450 1
原创 【LeetCode热题100】【链表】排序链表
拆成两个部分,要保持logn的递归树深度,每次拆分需要拆成两半差不多大小的,也就是寻找链表的中间节点,然后以中间节点为界限分成两个链表,即寻找链表的中间节点:使用快慢指针,当快指针到达链表末尾,慢指针即到达链表中间。然后是考察合并两个有序链表:如果其中一个链表为空,则返回另一个链表,比较两个链表首节点的大小,让小的节点成为新链表的头节点,递归合并后面的。最后是归并排序链表,先找出链表的中间位置拆分成两个链表,递归归并排序两个链表后合并。但是从面试的角度,我们应该在链表原地排序,这里使用最简单的归并排序。
2024-04-22 11:14:15 690
原创 【LeetCode热题100】【链表】随机链表的复制
非常妙的思路,先用一个哈希表将旧链表的节点和新链表的节点一一对应起来,然后将新链表的节点串起来,对于random可以根据哈希表里面的对应找到新链表里面对应的节点,妙哉。,该指针可以指向链表中的任何节点或空节点,请你深拷贝这个链表。的链表,每个节点包含一个额外增加的随机指针。
2024-04-21 22:08:41 349
原创 【LeetCode热题100】【子串】最小覆盖子串
先用一个哈希表记录目标字符串target的字符种类及其数量,然后用一个滑动窗口从字符串source上滑过去,i负责起点缩减,j负责终点延申,碰到一个字符,更新它在哈希表里面的数量减一,表示已经找到一个,当数量减到0,表示这个字符已经收集完毕,需要收集的种类数量减一。如果s[i]在哈希表里面的数量小于0,说明s[i]已经多了,i可以往前缩减滑动字符串的长度。当需要收集的字符串的种类已经为0,说明已经找到了,比较和先前找到的长度看是否需要更新。所有字符的子串,则返回空字符串。所有字符的最小子串。
2024-04-21 15:32:22 459
原创 【LeetCode热题100】【图论】实现 Trie (前缀树)
这样存储字符串abc和abcd只会多一个d指向的节点,也就是相同的前缀会在相同的节点,每一个字母会有26种后缀,因此有26个指针指向后缀节点,如果某节点指针为空,说明没有该字母后缀。为了判断是否是前缀和存在单词,可以写一个查找前缀的函数,如果前缀存在返回节点指针,代码基本和插入相同,不同的地方在于当不存在当前字母时说明没有该前缀,直接返回空。插入字符串的时候,从头到尾安排单词的每个字母,如果不存在当前字母,为它创建一个新的节点。这应该和图论没啥关系,应该属于哈希和树,题目没讲前缀树到达是啥。
2024-04-20 22:13:23 664
原创 【LeetCode热题100】【图论】课程表
入度为0的说明没有先修课程,取出来修,并将相连的节点的入度减一,说明先修课程已经修了一个了,再判断有没有新的课程可以修的入队。先修课程,判断课程能不能修完,这是一个判断拓扑有序的问题,看看会不会成环。先建立有向图,记录每个顶点的入度,把入度为0的入队列。最后判断修了的课程和要修的课程数目是否相等。
2024-04-19 23:05:25 414
原创 【LeetCode热题100】【图论】腐烂的橘子
腐烂的橘子会污染周围的橘子,要求多少轮扩散才能把全部橘子污染,这就相当于滴墨水入清水,会扩散,其实就是广度遍历,看看遍历多少层可以遍历完可以遍历的。先遍历一次橘子,记录下腐烂橘子的位置和新鲜橘子的数目,然后广度遍历腐烂橘子并向外扩散污染新鲜橘子。注意向外扩散时需要每次取位置,因为移动会改变位置,位置需要重置。
2024-04-19 22:29:54 368
原创 【LeetCode热题100】【图论】岛屿数量
对于这道题来说,从是1的地方深度遍历,改写可以到达的地方,这样就是一个岛屿,如果还有1,说明还有岛屿。首先需要判断图的边界,然后再上下左右继续深度遍历,并把遍历到的标记为已访问,可以原地修改图做标记。考察图的遍历,从岛上上下左右能到达的地方都是这个岛。
2024-04-19 21:36:04 624
原创 【LeetCode热题100】【动态规划】最长有效括号
如果是...))这样的,也就是s[i-1]=),也就是套壳状态,那么s[i]必定需要对应一个s[j]=(来闭环,那么j是多少呢,j和i之间应该隔了dp[i-1]个,那么j应该等于i-dp[i-1]-1,dp[i]就应该是dp[i-1]+2再加上dp[j-1],那么状态转移方程应该为。还需要加上数组边界条件的判断。
2024-04-19 20:06:09 244
原创 【LeetCode热题100】【动态规划】乘积最大子数组
对于和来讲,定义dp[i]是以nums[i]为结尾的最大子数组的和,那么dp[i]要么就是nums[i]加上之前的dp[i-1],即前一个子数组加上当前元素,要么是nums[i]自己新开一个子数组,所以状态转移方程。但是乘积与和不一样的地方在于负数的情况,负数加负数的和是越来越小的,但是乘积会因为碰到一个负数变成最大或者变成最小,因此需要用两个数组记录状态,dpMin记录最小,dpMax记录最大。要找乘积最大的连续子数组,我们之前做过找和最大的连续子数组。
2024-04-19 17:01:49 258
原创 【LeetCode热题100】【动态规划】最长递增子序列
让dp[i]是以nums[i]为结尾的子序列的最长递增长度,遍历nums[i]之前的元素,如果有比nums[i]小的,说明递增子序列可以延申。
2024-04-19 16:32:12 491
计算机导论-实验报告-互联网与网络安全
2022-04-14
计算机导论-实验报告-电子表格处理
2022-04-14
计算机导论-实验报告-算法设计工具
2022-04-14
计算机导论-实验报告-演示文稿设计.doc
2022-04-14
计算机导论-实验报告-文字信息处理
2022-04-11
计算机导论-实验报告-操作系统与软件
2022-04-11
大学物理实验-实验报告-测量地磁场
2022-04-11
大学物理实验-实验报告-单摆的研究
2022-04-11
计算机系统实验报告 LC-3仿真器安装和使用
2022-04-09
空间滤波器之平滑滤波器和锐化滤波器
2022-04-06
基于主成分分析的人脸识别
2022-04-06
人工智能之回溯法python求解9X9数独
2023-01-06
如何用matlab画球
2023-01-06
蓝桥杯C/C++省赛:排它平方数
2023-01-06
如何用Python画一个简单的笑脸
2023-01-06
奥特曼打怪兽.cpp 源码
2022-05-13
面向对象程序设计-奥特曼打怪兽
2022-05-13
面向对象程序设计-类的设计与实现-实验报告
2022-05-13
大学物理实验-实验报告-太阳能电池的特性测量
2022-05-13
计算机系统1 汇编语言编程 成绩排序 代码
2022-05-07
计算机系统1-实验报告-LC-3汇编语言求成绩等级
2022-05-07
大学物理实验-实验报告-不良导体热导率的测量.doc
2022-05-07
大学物理实验-实验报告-碰撞实验
2022-04-23
计算机系统-实验报告-LC-3机器码编程实验
2022-04-20
大学物理实验-实验报告-偏振光的观察与研究
2022-04-20
大学物理实验-实验报告-热敏电阻温度特性研究
2022-04-14
UE5中输入移动的问题
2024-02-23
CSP202303-2垦田计划
2023-09-07
goland远程连接Linux开发每次调试都会生成调试文件,调试一次便多出一个文件,求解
2023-08-06
pnnx的graph rewriter有什么用
2023-07-19
如何在pnnx中实现logsoftmax和logsigmoid的转换到ncnn
2023-07-17
unity hub打不开
2022-10-20
Java和Python的赋值运算符=是不是都是引用改名而已,不是值复制?
2022-08-25
问一下各位,C++的切片除了字符串、set、vector之外,还有什么可以切片呢
2022-08-10
用C++的STL的set可以解决子集问题吗?
2022-08-08
计算机系统概论问题进制黑箱问题
2022-03-18
浮点数标准在指数变换的时候为什么要加上127
2022-03-11
从右到左压栈到底是左边先进栈,还是右边先进栈,是先处理栈顶还是先处理栈底
2022-02-25
C语言 谁能解释一下这个问题
2022-02-24
快速排序中的问题,疑惑,待求解
2022-02-10
为什么当月拿了117分,但总分只有104分
2022-02-10
PAT 1015 德才论 代码运行超时
2022-01-30
福尔摩斯的约会部分正确
2022-01-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人