- 博客(112)
- 收藏
- 关注
原创 为树莓派4B编写platform驱动LED灯(采用DTS方式提供硬件信息)
最近学习了Linux platform driver子系统和dts的基本知识,写一个platform字符设备驱动来操纵GPIO控制LED灯,采用DTB文件来提供硬件信息,纯粹练手。修改DTS文件要修改DTS文件首先要确定自己使用的开发板所用DTB的版本,RPI 4B采用的是bcm2711-rpi-4-b.dts。下载一个在arch/arm/boot/dts/目录下有这个dts文件的linux内核源码,我下的是linux-5.10.31。通过查阅bcm2711的datasheet,找到和GPIO相关的物理
2021-05-22 14:55:23
899
1
原创 一个端口到底可以建立多少TCP连接?
一个端口到底可以建立多少TCP连接?这是一个很基础的问题,但是网上对于这个问题的解释千奇百怪。有人说,一个端口只能建立一个TCP连接,所以说无论服务还是客户端都最多只能建立65535个TCP连接。还有人说,服务端因为accept之后新建立的socket是重用listen的端口的,所以服务端最多可以建立65535×n个连接,而客户端connect建立的端口不可重用所以客户端只能65535。这里有两个误解:误解一:一个端口只能建立一个TCP连接。事实上Linux内核对TCP连接的识别是通过四元组来区分,
2021-05-14 16:21:24
17582
6
原创 C++ 错误:“xxx” does not name a type
遇到错误:这其实是由于头文件的递归引用造成的,也就是在A类头文件中include了B,在B类头文件也include了A造成的!
2021-03-16 17:03:36
2917
原创 Qt中QLabel不显示的问题
下面的代码是使用QLabel对图片的显示: QLabel * label = new QLabel(this); QPixmap pixmap; pixmap.load(":/res/LevelCompletedDialogBg.png"); label->setGeometry(0,0,pixmap.width(),pixmap.height()); label->setPixmap(pixmap);//
2021-03-16 16:51:29
8641
原创 leetcode-计算器问题总结(栈)
一. 带乘除不带括号的计算器这题属于计算器问题中比较简单的,首先不带括号所以不用考虑括号匹配的问题,然后我们知道“先乘除后加减”,所以对于乘除应该直接求出结果,对于加减法来说应当记录每个数字前面的正负号然后直接将带符号的数入栈。还要注意的一点是,需要计算连续数字字符子串的十进制表达,这点好实现。最后栈中应当全部是带符号的数,对他们全部求和即可!例如:3-24,遇到数字4的时候,因为其前面的符号是,所以用栈顶的-2乘以4 = -8,所以栈内是3,-8,结果就是-5!class Solution {pu
2021-03-12 11:28:48
285
原创 ubuntu上mysql最彻底的删除方法
ubuntu上mysql最彻底的删除方法因为前段时间ubuntu给我自动更新,好像还在更新着我就给关机了还是怎么的,mysql就再也用不了了,而且安装也没办法安装。于是一鼓做气,把mysql彻底卸载了再重装!网上找到最好的方法:https://stackoverflow.com/questions/13276088/cant-start-mysql5-5-on-ubuntu-12-04-dpkg-dependency-problems我自己修改了下,亲测可行:sudo apt-get remove
2021-03-07 14:10:31
282
原创 深信服C++后台开发实习面经
深信服C++后台开发实习面经加微信电话面,时长25min,面试官听口音应该是个广东姐姐自我介绍strcpy的缺点进程间通信的方式Linux的内存模型Linux的启动流程遇到过的内存错误,以及避免他们的方式防御编程TCP/IP握手机制TCP/IP有哪些选项数据结构问题:动态规划的上楼梯问题四个人过独木桥,速度分别是1,2,5,8,只有一个手电筒并且每次过桥都要拿手电筒(意味着过去的人还要把手电筒送回来),一次只能有两个人通过桥,问所有人过桥的最快速度哈希解决冲突的方式知道哪些
2021-03-02 20:50:33
486
原创 C/C++中函数声明的作用
C/C++中函数声明和include头文件的作用参考:https://blog.csdn.net/qq_28648279/article/details/78463345一直想不明白,函数声明的作用。在include中我们只是把函数的声明放入代码了,调用函数的具体实现还是要看函数的定义,那么include函数声明到底有什么作用呢?按理说我只要能正确链接对应的函数定义就可以了呀?在参考的博客中看到这么一段话:”其实函数声明的作用是让编译器帮你检查你调用函数时有没有错误。比如参数的数量是否正确,如果调用函
2021-02-27 12:20:07
3522
原创 关于RCU-protected array indexes的探究
关于RCU-protected array indexes的探究在师兄的驱动代码中看到了几个和rcu index相关的代码在编译的时候报错,原因是现在的linux内核已经废除使用RCU-protected array indexes了。现在建议,用smp_load_acquire对rcu_dereference_index_check进行替换参加文章内容:Abolition of RCU-protected array indexesThe RCU API has long permitted RC
2021-02-25 17:30:52
112
原创 关于RCU-sched的研究
关于RCU-sched的研究对于synchronize_rcu原理的研究,在现在的源码中发现: * When synchronize_rcu() is invoked on one CPU while other CPUs * are within RCU read-side critical sections, then the * synchronize_rcu() is guaranteed to block until after all the other * CPUs exit the
2021-02-24 22:32:28
3924
原创 leetcode-128. 最长连续序列
这题挺让我奇怪的,看起来没有hard的难度,但是正确的解法考察对各种STL时间复杂度的理解。题目要求时间复杂度做到O(n),那么其实是不能用map或set来做,因为它们的内部是由红黑树实现的(平衡搜索二叉树),其插入,查找的时间复杂度都在O(logN),将数组逐个插入维护map的操作时间复杂度就到了O(NlogN)了。正确的解法是,利用unordered_set的哈希特性,其插入查找的时间复杂度都在O(1),最坏是O(N)。对于数组中的每个数x,我们只需要查找在数组中是否存在x+1,x+2,x+3…x.
2021-02-12 15:38:51
107
原创 leetcode-703. 数据流中的第 K 大元素之TopK问题
今天是农历2021的最后一天,leetcode贴心的给了一道简单。这是一个经典的TopK问题,可以用排序时间复杂度在logN的算法解决。注意priority_queue是对堆排序的应用,但是需要决定对什么container维护堆排序:priority_queue<Type, Container, Functional>,Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector!当我们采用升序的优先队列时需要手动指定conta
2021-02-11 14:40:27
246
原创 leetcode-992. K 个不同整数的子数组之滑动窗口
这个题目的示例其实是有误导性的,假如题目以:12,121,21,1212,212,12,23的方式给出,我们马上就可以发现其实就是求以A[i]结尾的且满足不同整数个数为K的子数组的个数!因此,我们其实只要知道使得左侧满足不同整数个数为k的最远的位置low,和使得左侧满足不同整数个数为k的最远的位置high,high-low就是我们要的结果!将每个位置的high-low求和,就是题解!这里如何维护high和low的位置有技巧,题目已经告诉了所以可以不用map,直接用长度为A.size()+1的vecto
2021-02-09 22:46:51
83
原创 linux内核模块是如何调用的内核函数?
linux内核模块是如何调用的内核函数?在学习Linux设备驱动的过程一直有一个疑惑:我们在写用户空间程序的后自然是需要include用户空间的头文件,而头文件中声明函数的定义又需要编译成库或目标文件,链接到最终的可执行文件中去。但是在编写内核模块的时候,从哪里找的linux内核头文件呢?而linux内核头文件中对应函数的定义又放在哪里的呢?事实上我们想要编译内核模块首先就需要构建好内核源码树,或者直接使用本系统的内核头文件,我们一般都是直接使用本地的内核头文件的,放在:/usr/src/linux-
2021-02-08 17:14:32
1403
原创 leetcode-424. 替换后的最长重复字符之滑动窗口
据说这题是字节笔试的第一题,说不定leetcode这个月是双指针月?这题的思路我其实是有了,怎么样保证子串在k次替换以内成为全部重复呢?**只要子串长度减去子串中重复次数最多的元素出现的次数不大于k就可以!**但是怎么不断的维护统计重复次数最多的元素出现的次数是我没有想到的。实际上这题的解法,就是求以字符串中每个字符其最长重复长度,然后返回其中最长的作为答案!class Solution {public: int characterReplacement(string s, int k) {
2021-02-02 19:14:06
115
原创 leetcode-778. 水位上升的泳池中游泳之DFS+二分法与并查集
这道题的前一天的每日一题”1631. 最小体力消耗路径“也是相同的解法,只是在条件上有所不同,甚至这道hard比1631的medium还简单一些!对题目进行抽象,题目要求的从左上角到右下角其实可以抽象为寻找从左上角顶点到右下角的连通路径!很显然这个连通路径可以有多种,题目需要的是所经过的顶点的最大值最小的那条路径!所以采用图论的方法,将每个每个坐标方格抽象为图中的顶点,将相邻两点间数值大的那个点的值作为边权值,对所有边依旧边权值从小到大排序。对这些边进行并查集Union连接,直到发现连接完当前边后,左上
2021-01-30 14:30:29
168
原创 leetcode-947. 移除最多的同行或同列石头之DFS与并查集
题目这个月是图论月啊,各种并查集和图论算法。。。各个石头处于同列同行的性质其实就是石头之间的连接关系!要是删除了一个石头,那么由它所发出的边都要删除。而对于一个联通分量来说,是一定最多能删到只剩一个顶点的!因此这题其实就是要求是是有多少个联通分量!因此需要先根据stones列表来维护各个石头的联通关系,在同一列和同一行的石头都需要建立两两相连的边!然后通过DFS来求分量个数。class Solution {public: int removeStones(vector<vector&
2021-01-15 17:39:54
121
原创 leetcode-1203. 项目管理之拓扑排序
题目分析从题目可以比较简单的看出要使用拓扑排序,显然是需要对item建立图结构的,容易得到item的拓扑排序序列。但是题目要求:同一小组的项目,排序后在列表中彼此相邻!怎么理解这个条件呢?也就是说,属于同一个小组的项目必要可以独立的拎出来,不需要依赖别的小组的进度!假如小组A的部分依赖于小组B,而小组B也有部分依赖于小组A,那么其拓扑排序必定是:B --> A --> B,而无法做到题目要求的同一小组的项目,排序后在列表中彼此相邻。因此为了确定小组间的顺序,我们需要将各个小组要构建图结构,
2021-01-13 20:18:50
204
原创 leetcode-207.课程表之有向图的环路检测(拓扑排序,DFS)
从题目可以很容易看出是需要建立有向图并检测是否有回边,即是否存在环路的问题!这个需要确定前驱课程已经学过的例子其实就是拓扑排序最经典的例子。引用百度百科:通常,我们把这种顶点表示活动、边表示活动间先后关系的有向图称做顶点活动网(Activity On Vertex network),简称AOV网。例如,假定一个计算机专业的学生必须完成图3-4所列出的全部课程。在这里,课程代表活动,学习一门课程就表示进行一项活动,学习每门课程的先决条件是学完它的全部先修课程。如学习《数据结构》课程就必须安排在学完它.
2021-01-11 11:11:09
1029
原创 leetcode-399.除法求值之并查集
题目这道题要是不知道并查集的方法还可以通过DFS或BFS来做,这也是我第一次在leetcode遇到图相关的题目,很有意义!事实上题中的相除关系可以通过图的方式来表达,而queries中的求商可以通过求换算关系来得到,比如求a/d,那么我们要是能够将a和d都换算成相同的中间变量即可!我们可将a/b = 2.0变为两个顶点和一个边的关系来表示,a—>b,权重为2; 那么再加上b/c = 3.0,将图扩展为a—>b—>c,权重分别为2.0,3.0。那么当我们要求a/c的值的时候,只需要求a
2021-01-08 14:49:33
286
原创 在腾讯云服务器(Ubuntu)部署本地Django+Apache+MySQL项目
云服务器的环境配置更新源sudo apt update本地已经自带python2和python3(3.6)了,安装pipsudo apt install python3-pip本项目在本地并没有使用python虚拟环境,因此也不对虚拟环境配置安装Djangopython3 -m pip install django安装mysqlsudo apt install mysql-server sudo apt install mysql-client安装apache2sudo ap
2020-12-26 11:56:41
175
原创 解决回文串问题的两种模板解法
我们可以发现leetcode中有很多回文相关的问题,是常考点。这些题目大多是求回文子串长度或输出所有回文字串又或是分割回文串等,而大部分和回文串相关的问题都可以由两种模板方法解决。以最经典的leetcode第五题为例子:模板方法一:动态规划我们定义dp[i][j]表示字符串i~j是否是回文子串,那么我们可以得出状态转移方程if(dp[i+1][j-1] == 1 && s[i] == s[j]) dp[i][j] = 1完整代码:class Solution {publi
2020-12-22 21:13:17
177
2
原创 leetcode-二叉树的前中后遍历的迭代方法
题目就不用列了,递归法是很简单的,但是迭代法还是有一定难度,在此记录前序(easy):class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; if(root == NULL) return res; stack<TreeNode*> s; s.push
2020-12-19 17:07:46
112
1
原创 Linux 在动态链接库中使用static静态函数会导致的问题
我们知道static静态函数相比于全局函数,会把范围限定在自己所在文件的范围,对其他的编译单元是不可见的!那么若在动态库中定义了static静态函数并完成库的编译,那么在主程序加载并试图调用这个static静态函数的时候会找不到它!因此需要在主程序中直接调用的函数在动态库中不要定义和声明为static类型!同样的问题也在stackoverflow有讨论:https://stackoverflow.com/questions/5526461/gcc-warning-function-used-but-n
2020-12-17 11:41:59
1226
2
原创 Linux 编译成功动态链接库但是运行时:error while loading shared libraries: liberr_handle.so: cannot open shared obje
今天遇到了一个问题,我写的动态链接库在编译链接的时候都没有问题:gcc test.c -o test -L ../lib/ -lerr_handle -g但是在运行时却报错:./test: error while loading shared libraries: liberr_handle.so: cannot open shared object file: No such file or directory明明我已经通过gcc的-L和-l参数指定了要去哪找动态链接库了,但是为什么在运行的时
2020-12-17 11:15:15
600
原创 错误解决方法:error: reference to non-static member function must be called
在刷leetcode时遇到错误:这是因为我在类成员函数中调用三个参数的sort(),并且也将cmp函数定义为类成员函数,需要将cmp函数在类中定义为static!代码如下:class Solution {public: static bool cmp(vector<int>& a,vector<int>& b){ //bool cmp(vector<int>& a,vector<int>& b) 错误
2020-12-16 14:08:02
29974
12
原创 leetcode-290. 单词规律之哈希双射
这题用到了一一对应映射关系的双射问题,也就是要验证a–>dog和dog–>a的关系都是唯一的!代码:class Solution {public: bool wordPattern(string& pattern, string& s) { istringstream is(s); string tmp; vector<string> strs; while(is>>tmp)
2020-12-16 13:07:07
147
转载 C++隐式类型转换与explicit
转自:https://www.cnblogs.com/QG-whz/p/4472566.html《C++ Primer》中提到:“可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。”这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是有默认实参的。那么,什么是“隐式转换”呢? 上面这句话也说了,是从 构造函数形参类型 到 该类类型 的一个编译器的自动转换。下面通过代码来看一看:#include "s
2020-12-13 20:23:39
119
原创 leetcode-842. 将数组拆分成斐波那契序列之回溯法DFS
最近这几天的每日一题都不简单啊。。。这道题实在没想到真的是这么暴力的回溯,我还以为又是和前几天的每日一题有什么骚操作可以一次遍历搞定。。这里回溯的想法是尝试所有如下:1,2,3…; 1,23,4…; 1,234,5…; …12,3,4…; 12,34,5…; 12,345,6…; …其实就是去遍历分别以1,12,123,1234等为开头的情况,去找到分割数大于等于3且满足前两个的和为第三的条件!并且可以进行剪枝(来自官方题解):代码class Solution {public: .
2020-12-09 10:35:48
80
原创 leetcode-659. 分割数组为连续子序列
这题虽然是medium,虽然题目很好懂,虽然总觉得再想想就能解出来,但是这辈子都想不出来。。。官方题解还用了堆,优先队列,相当复杂,评论中一种方法很直白,可以总结为一句话:对于数x,要是有长度合法且末尾为x-1的组合,那么应当并入这个组合而不是另起炉灶class Solution {public: bool isPossible(vector<int>& nums) { unordered_map<int,int> nums_count; //
2020-12-08 11:11:46
89
原创 leetcode-42. 接雨水之单调栈
题目前天学习了一道单调栈的问题(拼接最大数),又找到一道类似方法的题目,而且也是hard难度的,说明这个单调栈是算法中比较难的点方法一想了很久u最后搞出一种时间复杂度为O(n2)的方法,是先找到数组中的最大值max,然后从1到max向上遍历,找出大于等于1,2,3…max的所有数,求他们的距离之和就是每一层可以装下的雨水!class Solution {public: int trap(vector<int>& height) { if(height.s
2020-12-04 13:54:12
141
原创 leetcode-321. 拼接最大数之单调栈
题目作为一道hard题目的意思还是比较好理解的,而且可以推知需要使用单调栈; 题目提到要求取出的数字保持在原数组中的相对顺序,而且要求拼接的数最大,那么可以分解为分别求两个数组能获得的保持原相对顺序且应当是降序的序列!其实就是求两个数组的各自的单调栈(单调递减),但是要注意的是题目还有长度限制,这里是题目的难点!转题解中的一个图,要是能drop掉的数等于0了,那么后续的数应当直接填补上:这里的drop_num等于数组长度减去要求的长度,表示的是按照递减条件能从单调栈pop出来的数的数量;求单调栈的方法
2020-12-04 13:24:51
125
原创 leetcode-222. 完全二叉树的节点个数
题目方法一年轻人不将武德,直接DFS遍历求解,但是没有用到题目完全二叉树的性质!!class Solution {public: int count = 0; int depth_max = 0; int countNodes(TreeNode* root) { DFS(root); return count; } void DFS(TreeNode* root){ if(root == NULL){
2020-11-24 22:09:13
73
原创 leetcode-48. 旋转图像
题目方法一其实在做这题的时候画图已经把这种方法给画出来了,但是没深入想,没有找到具体的规律!整体矩阵的顺时针旋转可以分解为:(1)每个外圈的旋转(2)每个圈都分为左上,左下,右上,右下(3)左上 = 左下; 左下 = 右下; 右下 = 右上; 右上 = 左上class Solution {public: void rotate(vector<vector<int>>& matrix) { int up_limit = 0;
2020-11-20 09:56:25
73
原创 leetcode-134. 加油站
题目这题我一开始没有注意,把cost[i]当作是从上一个加油站开到这一个加油站需要的油耗了,实际题目写的很清楚,是从当前油站开到下一油站的油耗; 因此,只要gas-cost的累加结果一直大于0,那就肯定可以跑一圈!但是怎么确定要从哪里跑呢,题解中提供了一个很好的思路:来自:https://leetcode-cn.com/problems/gas-station/solution/shi-yong-tu-de-si-xiang-fen-xi-gai-wen-ti-by-cyayc/只要我们找到累加的
2020-11-19 09:42:08
87
转载 CPU的流水线,分支预测与乱序执行
流水线转自:http://www.elecfans.com/emb/dsp/20180405657563.html流水线的概念来源于工业制造领域,以汽车装配为例来解释流水线的工作方式,假设装配一辆汽车需要四个步骤:第一步冲压:制作车身外壳和底盘等部件。第二步焊接:将冲压成形后的各部件焊接成车身。第三步涂装:将车身等主要部件清洗、化学处理、打磨、喷漆和烘干。第四步总装:将各部件(包括发动机和向外采购的零部件)组装成车。汽车装配则同时对应需要冲压、焊接、涂装和总装四个工人。最简单的方法是一辆汽车依
2020-11-18 12:21:42
3473
原创 leetcode-406. 根据身高重建队列
题目分析h代表的是人的身高,k代表的是前面比身高大于等于他的人的人数; 因此,为了知道一个一人前面有多少身高大于等于他的人,应当依据h进行降序排列; 并且我们知道,对于同等身高的人来说,k应当是升序的; 所以,自定义排序方法:对h降序排列,对k升序排列,并定义结果数组res,然后遍历这个排好序的数组,对于其k要大于等于当前res长度的(这个长度代表实际身高大于等于这个人的人数),直接插入末尾,而对于其k要小于当前res长度的需要插入到其k所指定的位置代码bool cmp(const vector&
2020-11-16 22:00:09
108
原创 KVM/QEMU安装配置方式
KVM/QEMU安装配置方式下载qemu:sudo apt install qemu上面分别是qemu可以模拟的各种架构,下载了Linux发行版的镜像之后,可以通过命令启动iso:创建虚拟机空间:qemu-img create -f qcow2 OS.img 20Gqemu-system-x86_64 -boot d -cdrom ubuntu-16.04-desktop-amd64.iso -hda OS.img -m 2048参数说明:qemu-system-x86_64命令是
2020-11-13 11:19:38
1048
原创 leetcode-57.插入区间
题目leetcode的每日一题,看到是hard有些慌,但是看题目似乎并不难; 有两种想法,在本地空间对intervals进行修改,或新建vector来插入本地修改的方法需要做很多判断,而且需要在本地vector进行多次erase操作,效率并不会比新建vector效率高!本地修改代码(要是遇到很多需要合并的单元会导致很多erase操作,很耗时!):class Solution {public: vector<vector<int>> insert(vector<
2020-11-05 10:06:02
102
原创 x86下KVM启动Jailhouse
x86下KVM启动Jailhouse首先按照官方文档需要关闭linux kernel的iommu:VT-d IOMMU usage (DMAR) has to be disabled in the Linux kernel, e.g. via the command line parameter:intel_iommu=off方法:修改/etc/default/grub(/etc下的是grub的配置文件,/boot下的真正启动时加载的grub文件),调整GRUB_CMDLINE_LINUX内容
2020-11-04 17:03:33
980
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人