自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 资源 (1)
  • 收藏
  • 关注

原创 Linux I/O模式

一、概念说明1. 用户空间与内核空间现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核

2020-09-10 15:29:37 184

原创 select、poll、epoll简单比较

1. select模型int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);select 允许应用程序监视一组文件描述符,等待一个或者多个描述符成为就绪状态,从而完成 I/O 操作。 fd_set 使用数组实现,数组大小使用 FD_SETSIZE 定义,所以只能监听少于 FD_SETSIZE 数量的描述符。有三种类型的描述符类型:readset、writ

2020-09-10 14:19:27 245

原创 leetcode200题之哈希表(二)

1. 有效的字母异位词法一:排序通过将 s的字母重新排列成 t来生成变位词。因此,如果 t 是 s 的变位词,对两个字符串进行排序将产生两个相同的字符串。此外,如果 s 和 t的长度不同,t不能是 s的变位词,我们可以提前返回。法二:哈希表为了检查 t是否是 s 的重新排列,我们可以计算两个字符串中每个字母的出现次数并进行比较。因为 s和 t 都只包含 a-z 的字母,所以一个简单的 26 位计数器表就足够了。我们需要两个计数器数表进行比较吗?实际上不是,因为我们可以用一个...

2020-08-29 09:10:20 309

原创 剑指offer之栈、堆、队列

1.用两个栈实现队列题目:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof思路:加入队尾 appendTail()函数: 将数字 val 加入栈 A 即可。删除队首deleteHead()函数: 有以下三种情况。当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。 否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1−1 。 否则: 将栈 A 元素全部转移至

2020-08-27 22:26:54 133

原创 设计模式之单例模式(C++实现)

单例模式你需要系统中只有唯一一个实例存在的类的全局变量的时候才使用单例。实现要点:1.私有构造函数2.声明静态单例对象3.构造单例之前要加锁class Singleton{private: Singleton(); Singleton(const Singleton& other);public: static Singleton* getInstance(); static Singleton* m_instance;};Single

2020-08-27 18:52:26 155

原创 剑指offer之链表

1.从尾到头打印链表题目:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof思路:栈的特点是后进先出,即最后压入栈的元素最先弹出。考虑到栈的这一特点,使用栈将链表元素顺序倒置。从链表的头节点开始,依次将每个节点压入栈内,然后依次弹出栈内的元素并存储到数组中。class Solution {public: vector<int> reversePrint(ListNode* head

2020-08-25 21:18:56 122

原创 剑指offer之树专题(一)

1.重建二叉树题目:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/思路:前中->二叉树,前:根-左-右,中:左-根-右;先得根在中序遍历中的位置,然后可得左子树的长度,递归遍历。class Solution {public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {

2020-08-24 21:05:37 94

原创 剑指offer之数组(二)

1. 构建乘积数组题目:https://leetcode-cn.com/problems/gou-jian-cheng-ji-shu-zu-lcof/思路:通过 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1],我们发现 B[i] 就是 A[i] 左边所有元素的积 乘 A[i] 右边所有元素的积。从左往右遍历累乘,结果保存在数组 ret 中,此时 ret[i] 表示,A[i] 左边所有元素的乘积 然后从右往左遍历累乘,获取A[i] 右边所有元素的乘积 两边遍历.

2020-08-23 22:58:30 143

原创 剑指offer之数组(一)

1. 数组中重复的数字题目:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/思路:1. 利用unordered_set 2.(原地置换)如果没有重复数字,那么正常排序后,数字i应该在下标为i的位置,所以思路是重头扫描数组,遇到下标为i的数字如果不是i的话(假设为m),那么我们就拿与下标m的数字交换。在交换过程中,如果有重复的数字发生,那么终止返tureclass S...

2020-08-23 19:44:05 92

原创 剑指offer之动态规划

1. 连续子数组的最大和题目:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/思路:(1)定义dp:dp[i]代表以元素nums[i]nums[i]为结尾的连续子数组最大和。(2)状态转移:若 dp[i−1]≤0 ,说明 dp[i - 1] 对 dp[i]产生负贡献,即 dp[i-1] + nums[i]还不如 nums[i] 本身大。当 dp[i - 1] > 0 时:执行 dp[...

2020-08-22 21:29:42 177

原创 Linux网络编程基础API

1. socket地址API主机字节序和网络字节序字节序分为大端字节序(高字节存储在低地址处)和小端字节序(高位字节存储在内存的高地址处)。小端字节序又称主机字节序,大端字节序也称网络字节序。主机字节序和网络字节序转换函数:#include<netinet/in.h>unsigned long int htonl(unsigned long int hostlong);unsigned short int htons(unsigned short int hostlong

2020-08-22 16:46:39 173

原创 多线程编程

创建线程和结束线程基础API创建一个线程的函数 pthread_create#include<pthread.h>int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void*(start_routine)(void*), void* arg);/* 参数:*1. thread参数是新线程的标识符,后续pthread_* 函数通过它引用新线程,pthread_t是一个整数类型。*2. attr

2020-08-19 10:23:57 113

原创 剑指offer之DFS

1. 矩阵中的路径题目:思路:2.题目:思路:

2020-08-18 22:05:09 180

原创 leetcode200题之扫尾部分(四)

1. 整数反转题目:https://leetcode-cn.com/problems/reverse-integer/注意:res=res*10+pop;可能存在溢出问题。class Solution {public: int reverse(int x) { int res=0; int pop=0; while(x!=0){ pop = x % 10; x /= 10;

2020-08-17 21:44:50 157 1

原创 leetcode200题之回溯算法(二)

1. 全排列题目:https://leetcode-cn.com/problems/permutations思路:2.组合总和题目:https://leetcode-cn.com/problems/combination-sum思路:3.组合总和Ⅱ题目:https://leetcode-cn.com/problems/combination-sum-ii思路:4.子集题目:https://leetcode-cn.com/problems/subsets思路:5

2020-08-17 20:22:17 164 1

原创 leetcode200题之回溯算法(一)

1.电话号码的字母组合题目:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number思路:2.括号生成题目:https://leetcode-cn.com/problems/generate-parentheses思路:3.单词搜索题目:https://leetcode-cn.com/problems/word-search思路:4. N皇后题目:https://leetcode-cn

2020-08-17 18:26:54 14313 1

原创 leetcode200题之数组(三)

1. 两数之和由于哈希查找的时间复杂度为 O(1),所以可以利用哈希容器 map 降低时间复杂度 遍历数组 nums,i 为当前下标,每个值都判断map中是否存在 target-nums[i] 的 key 值 如果存在则找到了两个值,如果不存在则将当前的 (nums[i],i) 存入 map 中,继续遍历直到找到为止class Solution {public: vector<int> twoSum(vector<int>& nums, int targ

2020-08-16 20:29:32 109

原创 leetcode200题之数组(二)

1. 螺旋矩阵题目:https://leetcode-cn.com/problems/spiral-matrix/思路:首先设定上下左右边界 其次向右移动到最右,此时第一行因为已经使用过了,可以将其从图中删去,体现在代码中就是重新定义上边界 判断若重新定义后,上下边界交错,表明螺旋矩阵遍历结束,跳出循环,返回答案 若上下边界不交错,则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理 不断循环以上步骤,直到某两条边界交错,跳出循环,返回答案class Solution {

2020-08-16 18:26:03 114

原创 leetcode200题之链表(四)

1. 重排链表2.两两交换链表中的节点3.合并两个有序链表4.从尾到头打印链表5.两数相加题目:https://leetcode-cn.com/problems/add-two-numbers/

2020-08-16 16:06:53 162

原创 leetcode200题之链表(三)

1.旋转链表题目:https://leetcode-cn.com/problems/rotate-list/链表中的点已经相连,一次旋转操作意味着:先将链表闭合成环 找到相应的位置断开这个环,确定新的链表头和链表尾 新的表头在位置 n-k 处,其中 n 是链表中点的个数,新的链表尾就在头的前面,位于位置 n-k-1。(基于k<n的情况下) 如果 k >= n ,k 可以被写成 k = (k / n) * n + k % n 两者加和的形式,其中前面的部分不影响最终的结果,

2020-08-15 22:45:09 99

原创 leetcode200题之链表(二)

1.删除链表的节点 题目:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof/ 定位节点: 遍历链表,直到 head.val == val 时跳出,即可定位目标节点。 修改引用: 设节点 cur 的前驱节点为 pre ,后继节点为 cur.next ;则执行 pre.next = cur.next ,即可实现删除 cur 节点特例处理:当应删除头节点head时,直接返回head....

2020-08-15 20:46:15 90

原创 leetcode200题之链表(一)

1.删除链表中的节点我们无法访问我们想要删除的节点 之前 的节点,我们始终不能修改该节点的 next 指针。相反,我们必须将想要删除的节点的值替换为它后面节点中的值,然后删除它之后的节点。class Solution {public: void deleteNode(ListNode* node) { node->val=node->next->val; //将想要删除的节点的值替换为它后面节点中的值 node->next=nod

2020-08-15 18:26:36 145

原创 leetcode200题之扫尾部分(三)

1. 基本的计算器题目地址:https://leetcode-cn.com/problems/basic-calculator-ii/字符串转为整数实现:string s = "458";int n = 0;for (int i = 0; i < s.size(); i++) { char c = s[i]; n = 10 * n + (c - '0');}// n 现在就等于 458如果是数字,连续读取到 num如果不是数字,就是遇到了下一个符号,之前

2020-08-15 15:41:04 138

原创 leetcode200题之扫尾部分(二)

1. 各位相加class Solution {public: int addDigits(int num) { /*常规思路 int sum=0; while(num>=10){ while(num){ int t=num%10; sum += t; num /=10; }

2020-08-14 20:20:12 138

原创 leetcode200题之扫尾部分(一)

1. 超级丑数思路:与丑数Ⅱ想法一致。让我们从数组中只包含一个丑数数字 1 开始,使用K个指针 pos[j] ,标记所指向丑数要乘以的因子。算法很简单:在dp[pos[j]]×primes[j] 选出最小的丑数。并将该丑数对应的因子指针往前走一步.此题质因子为数组,丑数Ⅱ中为固定的3个数,可以直接3指针p1,p2,p5;class Solution {public: int nthSuperUglyNumber(int n, vector<int>& prim

2020-08-14 16:48:19 157

原创 leetcode200题之二叉树专题(四)

1. 最大的二叉树创建方法 construct(nums, l, r),用于找出在数组 numsnums 中从 ll 到 rr 索引(不包含第 rr 个位置)中最大二叉树的根节点。算法步骤如下:首先调用 construct(nums, 0, n),其中 n是数组 numsnums 的长度。 在索引范围 (l:r−1) 内找到最大值的索引,将 nums[max_idx] 作为根节点。 调用 construct(nums, l, max_idx) 创建根节点的左孩子。递归执行此操作,创建根节点.

2020-08-13 15:50:19 165

原创 leetcode200题之数组(一)

1.旋转图像2. 除自己以外数组的乘积3.合并区间4.1比特

2020-08-13 09:49:51 126

原创 leetcode200题之位运算

1. 不使用加减乘除做加法观察位运算中的两数加法:0 + 0 = 00 + 1 = 11 + 0 = 11 + 1 = 0(进位 1)发现:无进位和与异或运算规律相同,进位和与运算规律相同(并需左移一位)方法:a + b 的问题拆分为 (a 和 b 的无进位结果) + (a 和 b 的进位结果) 无进位加法使用异或运算计算得出 进位结果使用与运算和移位运算计算得出 循环此过程,直到进位为 0 class Solution {public:...

2020-08-12 16:52:07 116

原创 leetcode200题之哈希表(一)

1. 四数相加Ⅱ (leetcode 454题)用map存储前两个数组的和,然后计算c和d的和,最后在map中找是否存在c和d的和的相反数class Solution {public: int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) { unordered_map<int,

2020-08-10 20:57:38 131

原创 leetcode200题之双指针(一)

1. 验证回文串方法:我们直接在原字符串 s上使用双指针。在移动任意一个指针时,需要不断地向另一指针的方向移动,直到遇到一个字母或数字字符,或者两指针重合为止。也就是说,我们每次将指针移到下一个字母字符或数字字符,再判断这两个指针指向的字符是否相同。几个API: islower(char c) 是否为小写字母 isupper(char c) 是否为大写字母 isdigit(char c) 是否为数字 ...

2020-08-09 22:43:19 103

原创 libevent学习之Reactor模式

1.什么是Reactor模式维基百科上说:“The reactor design pattern is an event handling pattern for handling service requests delivered concurrently by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to as

2020-08-09 18:54:28 360

原创 leetcode200题之动态规划(四)

1. 分隔等和子集(1)定义状态:表示从数组的这个子区间内挑选一些正整数,每个数只能用一次,使得这些数的和恰好等于j(2)状态转移方程:不选择 nums[i],如果在 [0, i - 1] 这个子区间内已经有一部分元素,使得它们的和为 j ,那么 dp[i][j] = true;选择 nums[i],如果在 [0, i - 1] 这个子区间内就得找到一部分元素,使得它们的和为 j - nums[i]。 ...

2020-08-09 14:47:56 188

原创 leetcode200题之动态规划(三)

1. 最长重复子数组(1)dp[i][j]定义:表示A[i:]和B[j:]的最长公共前缀,那么答案即为所有dp[i][j]中的最大值(2)状态转移:如果A[i] == B[j],那么dp[i][j] = dp[i + 1][j + 1] + 1,否则dp[i][j] = 0。考虑到这里 dp[i][j] 的值从 dp[i + 1][j + 1] 转移得到,所以我们需要倒过来,首先计算 dp[len(A) - 1][len(B) - 1],最后计算 dp[0][0]cl...

2020-08-08 22:19:51 90

原创 leetcode200题之动态规划(二)

1. 比特位计数(1)res[i]含义:数字 i 二进制中1的个数(2)数组关系:奇数:二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1。 偶数:二进制表示中,偶数中 1 的个数一定和除以 2 之后的那个数一样多。因为最低位是 0,除以 2 就是右移一位,也就是把那个 0 抹掉而已,所以 1 的个数是不变的。(3)边界条件:res[0]=0;class Solution {public: vector<int> countBits(int

2020-08-08 17:48:43 139

原创 leetcode200题之动态规划(一)

1.零钱兑换(1)dp[i]含义:定义dp[i] 为组成金额i 所需最少的硬币数量(2)找数组元素之间关系:,coins[j]表示可选的硬币面值(3)初始值(base case):dp[0]=0;class Solution {public: int coinChange(vector<int>& coins, int amount) { vector<int> dp(amount+1,amount+1); dp[.

2020-08-08 14:13:13 271

原创 leetcode200题之二叉树专题(三)

1. 对称二叉树由对称二叉树定义: 对于树中 任意两个对称节点 L和 R,一定有: L->val = R->val:即此两对称节点值相等。 L->left->val = R->right->val:即 L的 左子节点 和 R的 右子节点 对称; L->right->val = R->left->val:即 L的 右子节点 和 R的 左子节点 对称。根据以上规律,考虑从顶至底递归,判...

2020-08-07 17:54:01 120

原创 leetcode200题之二叉树专题(二)

1. 二叉树的前序、中序、后序遍历(1)递归解决:根据前序遍历根左右,中序遍历左根右,后序遍历左右根即可。class Solution {public: vector<int> res; vector<int> preorderTraversal(TreeNode* root) { if(root==nullptr) return {}; recur(root); return res; }

2020-08-07 16:26:26 127

原创 leetcode200题之二叉树专题(一)

1. 二叉树的直径一条路径的长度为该路径经过的节点数减一,所以求直径(即求路径长度的最大值)等效于求路径经过节点数的最大值减一。而任意一条路径均可以被看作由某个节点为起点,从其左儿子和右儿子向下遍历的路径拼接得到。我们定义一个递归函数 depth(node) 计算d_node,函数返回该节点为根的子树的深度。先递归调用左儿子和右儿子求得它们为根的子树的深度 left 和 right,则该节点为根的子树的深度即为 max(L,R)+1,该节点的 d_node值为 L+R+1。class Sol.

2020-08-07 15:18:34 180

转载 C++智能指针详解

前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用。C++11智能指针介绍 智能指针主要用于管理在堆上分配的内存(动态分配的内存),它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。为什么要使用智能指针 智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间...

2020-07-30 17:53:04 178

原创 十大排序算法--C++实现(下)

6.快速排序7.堆排序8.桶排序9.基数排序 先低位后高位:先以个位数的大小来对数据进行排序,接着以十位数的大小来多数进行排序,接着以百位数的大小…… 由于某位数(个位/十位….,不是一整个数)的大小范围为0-9,所以我们需要10个桶,然后把具有相同数值的数放进同一个桶里,之后再把桶里的数按照0号桶到9号桶的顺序取出来,这样一趟下来,按照某位数的排序就完...

2020-06-16 12:21:22 194

libevent.pdf

文件为参考《libevent中文参考手册》以及《libevent源码深度剖析》(张亮)总结的libevent的学习资料。

2020-08-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除