- 博客(118)
- 收藏
- 关注

原创 【项目】在线OJ的项目,快进到自己造题刷
【项目】编写一个在线OJ的项目1.功能2.环境3.模快划分1.试题模块:2. 编译模块:3.http模块:4.工具模块4.功能编写:4.1.http模块4.1.1获取请求4.1.2回复响应4.2试题模块4.1.1试题保存形式1.功能做出一个在线oj系统,支持查看题目列表,支持点击单个题目,支持代码块书写代码,支持提交书写的代码到后端,支持后端编译+运行,支持返回结果2.环境1.利用开源库cpp-httplib中的httplib.h头文件链接如下:https:llgitee.comliqxglcpp
2021-01-30 17:03:28
2767
9
原创 升级!!!运用select实现一个简单的TCP通信!
升级!!!运用select实现一个简单的TCP通信多路转接模型select模型select模型的操作流程简介TCP的实现封装一个TCP服务端封装一个select类main程序多路转接模型多路转接IO:对大量的描述符进行就绪事件监控–让进程能够仅仅对就绪的描述符执行操作 不仅仅提高效率,而且避免阻塞。 只要是存在对描述符进行监控的需求,都可以使用多路转接模型进行事件的监控多路转接模型使用场景:只要对描述符有(可读,可写,异常)事件的监控需求都可以使用多路转接模型。也使用与对大量描述符进行监控,但是同一时
2021-04-03 20:31:27
496
3
转载 DNS域名解析之递归与非递归查询
DNS域名解析之递归与非递归查询递归查询迭代查询实例递归查询主机向本地域名服务器的查询一般是递归查询:如果本地域名服务器不知道查询的IP地址,那么本地域名服务器就会以DNS客户的身份向根域名服务器继续发生请求(即代替主机进行查询),而不是让主机自己进行下一步查询。因此递归的结果只有找到和没找到两种迭代查询本地域名服务器向根域名服务器的查询通常是采用迭代查询:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进
2021-03-27 19:25:46
2948
1
原创 深夜没事,抓个ARP包吧!
深夜没事,抓个ARP包吧!ipconfig查看网卡信息选择en33这个网卡,发送两次,询问192.168.21.1的mac地址,注意:ARP请求只能在同一子网内部进行广播arping -I ens33 -c 2 192.168.21.1老板,再开一台机子!输入以下命令进行抓包:tcpdump -i any -s 0 -w 123.dat把我们抓到的包发到windows下:sz 123.dat丢入wireshark中:看看ARP头部字段:...
2021-03-27 00:01:35
380
2
原创 cpp-httplib库简单原理,听说你还不会开源库?
cpp-httplib库的原理,听说你还不会开源库?介绍httplib.h头文件的处理流程httplib.h头文件的组成httplib.h头文件搭建服务端与客户端的原理Get接口listen(0.0.0.0,8989)接口介绍cpp-httplib是一个c++封装的http库,使用这个库可以在windows平台下完成http客户端、http服务端的搭建。在p2p点对点下载器的项目中,我们只需用到cpp-httplib中的 httplib.h这个头文件,所以我们在这里只讲一下httplib搭建tcp客户
2021-03-23 09:25:03
3839
原创 回溯算法:计算24点牌
回溯算法:计算24点牌1.将4个整数放入数组中2.在数组中取两个数字的排列,共有 P(4,2) 种排列。对每一个排列,对 – * / 每一个运算符,3.根据此排列的两个数字和运算符,计算结果4.改表数组:将此排列的两个数字从数组中去除掉,将 2.1.1 计算的结果放入数组中5.对新的数组,重复步骤 2恢复数组:将此排列的两个数字加入数组中,将 2.1.1 计算的结果从数组中去除掉可见这是一个递归过程。步骤 2 就是递归函数。当数组中只剩下一个数字的时候,这就是表达式的最终结果,此时递归结束。
2021-03-12 09:33:04
734
2
原创 记录2021.3.10
经验项目OJ数据结构二叉树操作系统基本语法进程线程NginxC++基本语法类与对象动态内存管理STL多态网络项目OJ介绍下你的项目你说项目支持高并发,介绍下多个用户链接,是创建多线程还是多进程?多线程是自己创建的吗?还是调用httplib库?看过httplib内部具体实现嘛?怎么获取用户提交的代码?为什么不用json格式在文件中存储数据???(懵逼)最多能接收多少个请求?boost库用到了哪些模块?其它模块了解吗?数据结构二叉树平衡二叉树二叉树的删除与插入操作系统基本语
2021-03-10 11:00:50
112
3
原创 排序算法:归并排序算法
归并排序算法#include<iostream>#include<string>#include<assert.h>using namespace std;void _MergeSort(int *ar, int left, int right,int *tmp){ int mid = (left + right) / 2; if (left >= right)//分的最后状态 return; //先分 _MergeSort(ar, l
2021-03-08 20:27:05
102
原创 排序算法:简单选择排序
排序算法:简单选择排序#include<iostream>#include<string>#include<vector>#include<algorithm>using namespace std;void selectSort(int R[],int n){ int i, j, k; for (int i = 0; i < n; i++) { k = i; for (j = i + 1; j < n; j++)
2021-03-08 19:55:48
118
原创 排序算法:快速排序
排序算法:快速排序#include<iostream>#include<string>#include<vector>#include<algorithm>using namespace std;int GetIndex(int R[], int left, int right){ //基准值 int flag = R[left]; while (left < right) { //右边找到小于基准值 while (righ
2021-03-08 19:47:26
107
原创 排序算法:折半插入排序
排序算法:折半插入排序前提:一个基本条件就是序列已经有序#include<iostream>#include<string>#include<vector>#include<algorithm>using namespace std;void InsertSort(vector<int>& R, int num){ int n = R.size(); R.resize(n + 1); int left = 0; in
2021-03-08 19:29:44
181
原创 排序算法:直接插入排序
排序算法:直接插入排序#include<iostream>#include<string>#include<vector>#include<algorithm>using namespace std;void InsertSort(int R[], int n){ int i, j; int tmp; for (int i = 1; i < n; i++) { tmp = R[i]; int j = i - 1; if
2021-03-08 19:00:07
92
原创 排序算法:堆排序
排序算法:快速排序堆排序:1.堆调整2.交换堆顶与最后3.堆调整数组下标默认从0开始#include<iostream>#include<string>#include<vector>#include<algorithm>using namespace std;void AdjustDown(int R[],int parent,int n){ //默认左孩子 int child = parent * 2 + 1; while (
2021-03-08 17:15:55
124
原创 贪心算法:分发糖果,一道经典易错的题目
贪心算法:分发糖果那么本题我采用了两次贪心的策略:一次是从左到右遍历,只比较右边孩子评分比左边大的情况。一次是从右到左遍历,只比较左边孩子评分比右边大的情况。注意实现细节!class Solution {public: int candy(vector<int>& ratings) { //贪心算法 //先从左往右遍历 //再从右往左遍历 //初始化给每个人一块饼干 vector<
2021-03-08 16:55:22
187
原创 贪心算法:跳跃游戏II
贪心算法:跳跃游戏II话说题目思路挺好想的,就是具体实现细节,边界条件真是让人头大啊提供几种方法留着以后参考:最好理解的方法:走到maxpos位置,step+1,初始化最远距离是nums【0】class Solution {public: int jump(vector<int>& nums) { if(nums.size() == 1) return 0; int curmaxPos = nums[0], n = nu
2021-03-06 15:27:39
177
原创 贪心算法:跳跃游戏
贪心算法:跳跃游戏思路:第一反应是回溯问题,不断穷举nums【i】可能经过的路线,但是很遗憾,运行超时了代码如下,也算是提供思路吧:class Solution {public: bool canJump(vector<int>& nums) { int startIndex = 0; bool flag = false; backtrack(nums, startIndex, flag); return
2021-03-06 12:37:38
432
3
原创 贪心算法:买卖股票的最佳时机II
贪心算法:买卖股票的最佳时机II思路:我们采用贪心算法,计算每天的利润,然后选取正利润即可代码:class Solution {public: int maxProfit(vector<int>& prices) { int maxSum = 0; for(int i = 1; i < prices.size(); i++) { maxSum += max(prices[i] - prices
2021-03-06 10:43:54
112
原创 贪心算法:最大子序和
贪心算法:最大子序和贪心算法思路:如果 -2 1 在一起,计算起点的时候,一定是从1开始计算,因为负数只会拉低总和,这就是贪心贪的地方!局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。全局最优:选取最大“连续和”代码如下:class Solution {public: int maxSubArray(vector<int>& nums) { int curSum = 0;
2021-03-04 17:49:23
217
1
转载 回溯算法:N皇后问题
回溯算法:N皇后问题N皇后的约数条件:不能同行不能同列不能同斜线图解:这样一看,N皇后问题就清晰多了void backtracking(参数) { if (row == n) { 存放结果; return; } for (节点展开) { if(isValid(row, col, chessboard, n)) { //设置皇后
2021-03-03 15:53:46
138
1
原创 回溯算法:排列问题II,去重方法全归纳!
回溯算法:排列问题II思路,这道题也是需要去重,但和之前的去重又有些不同,对去重进行一下整理:一般来说:组合问题和排列问题是在树形结构的叶子节点上收集结果,而子集问题就是取树上所有节点的结果1.组合数问题:i > startIndex && nums[i] == nums[i - 1] 这是对同一树层的相邻且相同的元素进行去重,比如【1,2 ,3, 3,3,4】,对于一树枝上的相同元素无需去重2. 递增子序列:利比上面稍微复杂,相同元素并没有相邻了,因此借用set进行去重,u
2021-03-03 12:53:19
774
3
原创 回溯算法:全排列问题
回溯算法:全排列问题思路:利用一个数组进行去重class Solution {public: vector<vector<int>> res; vector<int> path; vector<int> use; vector<vector<int>> permute(vector<int>& nums) { int step = 0; use.
2021-03-02 22:26:36
143
原创 回溯算法:递增子序列,弄清去重本质!
回溯算法:递增子序列,去重从此不再困难!思路:第一感觉和之前去重不是一样嘛?恭喜你上当了!输入:[1,2,3,4,5,6,7,8,9,10,1,1,1,1,1]会发现[1,1],[1,1,1],[1,1,1,1],[1,1,1,1,1]重复出现了两次,问题就显现了,因为:之前去重是单层节点相邻元素之间的去重,因此,排序后去重if(i > startIndex && nums[i] == nums[i - 1]),但是现在我们不能将其进行排序,所有我们要采用第二种方法去重:去除同一
2021-03-02 21:44:57
379
1
原创 回溯算法:子集II
回溯算法:子集II思路:该题为子集问题,与之前“组合总和问题II”的去重思想一致,即相同一层不能有相同的元素,因此去重逻辑:if(i > startIdex && nums[i] == nums[i - 1])不变,注意要先排序,将相同元素放在一起class Solution {public: vector<vector<int>> res; vector<int> path; vector<vector<
2021-03-02 20:27:29
92
原创 回溯算法:子集
回溯算法:子集思路:简单的回溯,认识本质之后,这就是一道模板题class Solution {public: vector<vector<int>> res; vector<int> path; vector<vector<int>> subsets(vector<int>& nums) { int startIndex = 0; res.push_back(pat
2021-03-01 17:17:16
85
原创 回溯算法:复原IP
回溯算法:复原IP思路:与上一篇:回溯算法:分割回文串异曲同工之妙,同样是切割字符串的思想,本体在剪枝方面可以进一步优化,当有不符合IP的字符串出现时,可以直接跳过本层所有循环,即break,但分割回文串则不可以,因为你不知道本层中加入下一个字符后是否可以构成回文串,因此不能跳出本层循环,即循环跳出条件为continueclass Solution {public: vector<string> res; string path; vector<string
2021-03-01 17:03:44
91
原创 回溯算法:分割回文串
回溯算法:分割回文串在for (int i = startIndex; i < s.size(); i++)循环中,我们 定义了起始位置startIndex,那么 [startIndex, i] 就是要截取的子串。class Solution {public: vector<vector<string>> res; vector<string> path; vector<vector<string>> par
2021-02-25 17:14:16
138
原创 回溯算法:组合总和问题一网打尽
回溯算法:组合问题I,II,III组合问题I回溯+剪枝代码如下:剪枝过程:i + (k - path.size()) <= n + 1,数组为单调递增的,当前位置不成立后,后序数字也无需进行比较了class Solution {public: vector<vector<int>> res; vector<int> path; vector<vector<int>> combine(int n, int k)
2021-02-25 14:19:54
1021
原创 回溯算法:电话号码的字母组合
回溯算法:电话号码的字母组合个人理解:将每一层展开,将下一次节点的开始位置传入递归中class Solution {public: vector<string> combinations; string combination; unordered_map<char,string> phoneMap { {'2', "abc"}, {'3', "def"}, {'4', "
2021-02-24 17:42:47
193
原创 栈与队列:TOP-K问题:前 K 个高频元素
栈与队列:TOP-K问题:前 K 个高频元素解法一:粗暴排序法最简单粗暴的思路就是 使用排序算法对元素按照频率由高到低进行排序,然后再取前 kk 个元素。以下十种排序算法,任你挑选!可以发现,使用常规的诸如 冒泡、选择、甚至快速排序都是不满足题目要求,它们的时间复杂度都是大于或者等于 O(n logn)O(nlogn),而题目要求算法的时间复杂度必须优于 O(n log n)O(nlogn)。解法二:借助 哈希表 来建立数字和其出现次数的映射,遍历一遍数组统计元素的频率维护一个元素数
2021-02-23 21:46:37
289
原创 Priority_Queue优先级队列的自我实现
优先级队列的自我实现代码如下:Priority_Queue.h文件:#pragma once#include <vector>namespace bite{ template<class T, class Container = std::vector<T>, class Com = std::less<T>> class priority_queue { public: priority_queue() {} templ
2021-02-23 21:20:35
163
原创 栈与队列:单调队列解决滑动窗口最大值
栈与队列:单调队列解决滑动窗口最大值设计单调队列的时候,pop,和push操作要保持如下规则:pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止以题目示例为例,输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3单调队列:3,-1单调队列:3,-1,-3
2021-02-23 15:25:52
372
原创 栈与队列:逆波兰表达式
栈与队列:逆波兰表达式思路:利用stringstream将字符串转化为数字,将计算结果入栈,注意:result = num2 / num1;result = num2 - num1num2与num1的顺序class Solution {public: int evalRPN(vector<string>& tokens) { stack<int> s; int size = tokens.size(); i
2021-02-22 15:37:13
101
原创 栈与队列:删除字符串中的所有相邻重复项
栈与队列:删除字符串中的所有相邻重复项class Solution {public: string removeDuplicates(string S) { stack<int> st; int size = S.size(); string res; for(int i = 0; i < size; i++) { if(st.empty()) {
2021-02-22 15:07:55
180
原创 栈与队列:有效的括号
栈与队列:括号匹配问题class Solution {public: bool isValid(string s) { if(s.empty()) return true; stack<char> _stack; for(int i=0;i<s.size();i++) { if(s[i]=='(' || s[i]=='[' || s[i]=='{')
2021-02-22 14:57:54
97
原创 栈与队列:用队列实现栈
栈与队列:用队列实现栈class MyStack {public: /** Initialize your data structure here. */ queue<int> qIn; queue<int> qOut; MyStack() { } /** Push element x onto stack. */ void push(int x) { qIn.push(x); }
2021-02-22 14:54:29
71
原创 栈与队列:栈实现队列
栈与队列:栈实现队列class MyQueue {public: stack<int> stIn; stack<int> stOut; /** Initialize your data structure here. */ MyQueue() { } /** Push element x to the back of queue. */ void push(int x) { stIn.push(
2021-02-21 16:46:25
73
原创 字符串:KMP算法,重复的子字符串
字符串:KMP算法,重复的子字符串普通的方法,双指针逐个比较:class Solution {public: bool repeatedSubstringPattern(string s) { for(int i = 1; i * 2 <= s.size(); i++) { if(s.size() % i == 0) { int begin1 = 0;
2021-02-21 14:10:57
644
1
原创 字符串:KMP算法,实现strStr()
字符串:KMP算法,实现strStr()代码:class Solution {public: int strStr(string haystack, string needle) { if(needle.size() == 0) return 0; int next[needle.size()]; getNext(next, needle); int j = 0; for(int i = 0; i
2021-02-20 17:43:09
389
原创 字符串:反转字符串里的单词
字符串:反转字符串里的单词stringstream对空格处理的妙用:class Solution {public: string reverseWords(string s) { stringstream st; st << s; string tmp; string ans; while(st >> tmp) { ans = ' ' + tmp +
2021-02-20 15:10:29
83
原创 字符串:反转字符串I,II,III
反转字符串I简单的双指针class Solution {public: void reverseString(vector<char>& s) { int begin = 0; int end = s.size() - 1; while(begin < end) { swap(s[begin], s[end]); begin++;
2021-02-18 17:19:54
241
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人