自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(385)
  • 资源 (2)
  • 问答 (9)
  • 收藏
  • 关注

原创 第三章-运输层

讲运输层前先灌输点网络层知识:网络层协议是IP协议,IP的服务模型是尽力而为交付服务,意思是尽可能地再通信主机之间交付报文段,但是不做任何保证,不确认报文段有没有正确交付、按序交付、完整性等等,所以是不可靠服务。之所以先灌输了点IP的知识是因为运输层的UDP和TCP实际就是将两个端系统间IP的交付服务扩展承运行在端系统上进程间的交付。这种主机间扩展到进程间的特点叫做运输层的多路复用和多路分解。

2023-08-07 21:14:28 201

原创 【python笔记】可变对象和不可变对象

在python中,一切事物皆是对象,变量是对象在内存中的存储和地址的。类型也是属于对象的,而不是变量。变量和对象是分离的,对象是内存中储存数据的实体,。“=”(赋值号)是将右侧对象的内存地址赋值给左侧的变量a = 1Python解释器其实顺序干了以下步骤:1.在内存中创建一个名为a的变量(变量没有类型,只是用来存储某个类型的指针,个人理解为C++中的void*,如有错求指正)2.创建一个int对象,该对象存储3。

2023-05-16 23:45:26 583 1

原创 第二章-应用层

介绍两种特别适合P2P设计的应用。第一种是文件分发:从单个源向大量的对等方分发文件。第二种是分布在大型对等方社区的数据库。

2023-02-08 21:51:32 342

原创 第一章-计算机网络和因特网

假设用单一的全球承载ISP互联所有接入ISP,全球ISP是一个由路由器和通信链路组成的网络,跨越全球并且至少有一个路由器连接所有下属的接入ISP。这样耗资巨大,接入ISP要向全球ISP付费,而且如果一个公司建立了这样一个全球ISP,那必然会有其他全球ISP来打破垄断,这就生成了网络结构2。由多个全球ISP和数十万个接入ISP组成。接入ISP现在可以根据价格等因素选择自己喜欢的全球ISP。但是全球ISP都是互联的,否则一个全球ISP的接入ISP将不能连接到另一个全球ISP的接入ISP。其实结构2也是不现实的,

2022-06-22 01:36:57 227

原创 【中等】平衡括号字符串的最少插入次数

注意题目要求:一个左括号要对应连续的两个右括号。当遇到左括号,对右括号的需求就加2,要是左括号是奇数个,说明前一个左括号对应奇数个右括号,此时必须插入一个右括号。遇到右括号期望值减1,要是减到-1表明多了一个右括号,此时必须增加一个左括号,同时让期望值变为1(已经减去当前这个右括号了)。...

2022-06-21 21:39:59 112

原创 【中等】使括号有效的最少添加

以左括号为基准看需要多少右括号,如果右括号比左括号多了就补上左括号的数量

2022-06-21 20:52:19 72

原创 第一章 认识并发

主要原因有两个:不使用并发的唯一原因就是收益比不上成本。使用并发的代码一般难以理解,所以编写和维护需要花大量时间;其次线程本身生成、启动、调度也都需要系统资源和时间,如果并发的收益弥补不了这些成本那还是算了。从一个普通单线程程序入手:改为多线程版:讲一下代码中的改动:这里就可以看出实现一个多线程比普通线程多做了大量工作,上面这个例子就满足之前讲的不用并发。...

2022-06-21 01:45:47 74

原创 【简单】环形链表

让快指针的速度是慢指针的两倍,这样当慢指针走k步,快指针一定是2k步,两个指针此时一定相遇

2022-06-19 18:15:09 119

原创 【中等】删除链表的倒数第N个结点

注意要用到虚拟结点dummy,应对题目中示例二的情况。删除倒数第一个结点,所以需要倒数第2个结点帮助删除,但是一共只有一个结点,所以需要虚拟头结点协助。

2022-06-19 18:04:59 51

原创 【简单】移动零

其实和原地修改是一样的,这里就是将所有的0抹除,最后再把数组后面剩余的元素赋值0。

2022-06-09 23:58:55 161 1

原创 Strategy策略模式

在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。策略模式解决如何在运行时根据需要透明地更改对象的算法,将算法与对象本身解耦,从而避免上述问题。用代码讲解:这里如果要新增一个别的税收算法比如FR,就要在代码中有两处改动,违背了封闭开放原则。使用策略模式进行改正:策略模式就是定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(

2022-06-02 23:32:14 64

原创 模板方法模式

从目的来看:在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。所以需要在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求。用代码来讲解:library开始一定是比application要早的,如果开发早的调用开发晚的称为晚绑定,开发晚的调用开发早的称为早绑定定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟(变化)到子类(延迟到子类指子类覆盖虚函数)中

2022-06-02 22:09:30 86

原创 面向对象设计原则

高层模块(一般是稳定的)不应该依赖于低层模块(一般是变化的),二者都应该依赖于抽象(稳定的)像上面的代码中,MainForm就属于高层模块,而Line、Rectangle(忽略我们自己加的Circle)就属于低层模块。而写法一中稳定的MainForm就依赖于会变化的Line和Rectangle。而写法二就改成依赖于一个抽象出来的Shape类,Line和Rectangle都是依赖于Shape这个抽象的。......

2022-06-02 20:52:49 81

原创 【简单】人口最多的年份

基础算法

2022-06-02 00:41:56 80

原创 【中级】连续的子数组和

class Solution {private: vector<int> preSum;public: bool checkSubarraySum(vector<int>& nums, int k) { int size = nums.size(); if (size < 2) return false; preSum.resize(size + 1, 0);.

2022-05-29 23:40:54 55

原创 【中等】统计优美子数组

使用到前缀和技巧,不过这里的前缀和统计的不是和,而是奇数的个数如示例1:nums = [1, 1, 2, 1, 1]preOdd = [0, 1, 2, 2, 3, 4]preOdd[j] - preOdd[i]这个式子可以得到nums在[i, j)区间中奇数的个数然后就可以循环这个preOdd数组,双指针寻找差值为k的次数。class Solution {private: vector<int> preOdd;public: int numberOf.

2022-05-29 02:15:01 114

原创 【简单】四数相加II

采用分为两组,Map 存一组,另一组和 Map 进行比对。这样的话情况就可以分为三种:Map 存一个数组,如 A。然后计算三个数组之和,如 BCD。时间复杂度为:O(n)+O(n3),得到 O(n3).Map 存三个数组之和,如 ABC。然后计算一个数组,如 D。时间复杂度为:O(n3)+O(n),得到 O(n3).Map存两个数组之和,如AB。然后计算两个数组之和,如 CD。时间复杂度为:O(n2)+O(n2),得到 O(n2).这里选用时间复杂度最低地第三种情况class Solution.

2022-05-29 01:43:59 111

原创 【简单】相交链表

class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *p1 = headA, *p2 = headB; while (p1 != p2) { if (p1 == NULL) p1 = headB; else ...

2022-01-06 18:50:37 166

原创 【简单】链表的中间结点

class Solution {public: ListNode* middleNode(ListNode* head) { ListNode *slow = head, *fast = head; while (fast != NULL && fast->next != NULL) { slow = slow->next; fast = fast->next-&gt.

2022-01-05 13:48:03 560

原创 【中等】删除链表的倒数第N个结点

class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* dummy = new ListNode(-1); dummy->next = head; ListNode* x = findNthFromEnd(dummy, n + 1); x->next = x->next->next; .

2022-01-04 14:28:21 961

原创 【困难】合并K个升序链表

class cmp { public: bool operator()(ListNode *a, ListNode *b) { return a->val > b->val; } };class Solution {public: bool less(ListNode *a, ListNode *b) { return a->val < b->val; } ListNode* mergeKLists(vector<ListNo..

2022-01-03 16:59:07 570

原创 【简单】合并两个有序链表

class Solution {public: ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { ListNode *dummy = new ListNode(-1); ListNode *p = dummy, *p1 = list1, *p2 = list2; while (p1 != NULL && p2 != NULL) { ...

2022-01-02 14:48:51 425

原创 【简单】移除元素

![在这里插入图片描述](https://img-blog.csdnimg.cn/3dd3773d23954ab29009a1adb998e523.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Ya355y86KeCd29ybGQ=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_centerclass Solution {public: int remo

2021-12-31 14:41:30 278

原创 【简单】删除排序链表中的重复元素

class Solution {public: ListNode* deleteDuplicates(ListNode* head) { if (!head) return NULL; ListNode *slow = head, *fast = head; while (fast != NULL) { if (slow->val != fast->val) ..

2021-12-30 19:05:48 203

原创 【简单】删除有序数组中的重复项

快慢指针的做法,慢指针在后面,快指针在前面探路,找到不同的元素就让slow往前走一步。这样当fast走完时[0, slow]就是不同的元素,而slow+1就是元素个数class Solution {public: int removeDuplicates(vector<int>& nums) { if (nums.size() == 0) return 0; int slow = 0, fast = 0; ..

2021-12-29 13:38:55 527

原创 【中等】在D天内送达包裹的能力(抽象二分问题)

按步骤来确定函数图像:确定自变量。题目问什么,什么就是自变量,所以这里船的运载能力就是自变量x。运输天数和运载能力成反比。target是运输天数,我们要在f(x) == D的限制下求出船最小载重x的范围。即最小载重和最大载重,left肯定是所有货物中最大的那个,因为至少得装一个货物。最大的就是所有货物的总重量,也就是一次就把货物全带走的极端情况所以题目又变成了和875爱吃香蕉的珂珂一样,在单调递减函数中,f(x) == D的条件下,求最小的承载能力xclass Solution {pu..

2021-12-29 01:10:03 358

原创 【中等】爱吃香蕉的珂珂(抽象二分问题)

明确题目,要求在h小时内吃的最多,用时最长根据题意可以知道:珂珂吃香蕉的速度越小,耗时越多。反之,速度越大,耗时越少,这就抽象成一个函数,x轴是吃香蕉的速度,y轴是吃香蕉的时间,可以知道这是一条随着x增加,y减小的递减函数图像;我们要找的是速度。因为题目限制了珂珂一个小时之内只能选择一堆香蕉吃,因此速度最大值就是这几堆香蕉中,数量最多的那一堆。速度的最小值是1,也就是一小时只吃一根;还是因为珂珂一个小时之内只能选择一堆香蕉吃,因此:每堆香蕉吃完的耗时 = 这堆香蕉的数量 / 珂珂一小时吃香蕉的数..

2021-12-25 15:50:34 728

原创 【中等】寻找峰值

如果nums[mid + 1]大于num[mid],则一定能在大于等于nums[mid + 1]的区域找到一个峰值,为什么?因为如果nums[mid + 1] > num[mid],则nums[mid + 2]要么大于nums[mid + 1],要么小于nums[mid + 1]。如果小于,则nums[mid + 1]就是峰值,如果大于就继续往后找。有人要问一直大于怎么办,也就是呈递增趋势,别忘了题目要求nums[-1] = nums[n] = -∞,如果一直递增,则nums[n - 1]一定是峰值.

2021-12-23 14:10:20 162

原创 【简单】第一个错误版本

// The API isBadVersion is defined for you.// bool isBadVersion(int version);class Solution {public: int firstBadVersion(int n) { int left = 1, right = n; while (left < right) { int mid = left + (right - left.

2021-12-21 13:54:32 27

原创 【中等】搜索二维矩阵II

class Solution {public: bool binarySearch(vector<int> &nums, int &target) { int left = 0, right = nums.size(); while (left < right) { int mid = left + (right - left) / 2; if (nums[..

2021-12-20 14:51:21 152

原创 【中等】搜索二维矩阵

class Solution {public: bool binarySearch(vector<int>& nums, int target) { int left = 0, right = nums.size(); while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] ..

2021-12-19 15:44:51 49

原创 【简单】搜索插入位置

class Solution {public: int left_bound(vector<int>& nums, int target) { int left = 0, right = nums.size(); while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] == ..

2021-12-18 14:08:20 37

原创 【中等】在排序数组中查找元素的第一个和最后一个位置

class Solution {public: int left_bound(vector<int>& nums, int target) { int left = 0, right = nums.size(); while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] == t.

2021-12-17 14:29:58 50

原创 【简单】二分查找

class Solution {public: int search(vector<int>& nums, int target) { int left = 0, right = nums.size(), mid; while (left < right) { mid = left + (right - left) / 2; if (nums[mid] == target).

2021-12-15 14:41:21 271

原创 【中等】无重复字符的最长子数组

class Solution {private: unordered_map<char, int> window;public: int lengthOfLongestSubstring(string s) { int left = 0, right = 0, len = 0; while (right < s.size()) { char c = s[right++]; ..

2021-12-14 16:19:21 3093

原创 【中等】找到字符串中所有字母异位词

class Solution {private: unordered_map<char, int> need, window;public: vector<int> findAnagrams(string s, string p) { for (char c : p) need[c]++; int left = 0, right = 0, valid = 0; int start = 0, len = INT_MA.

2021-12-13 14:21:59 4213

原创 【中等】字符串的排列

class Solution {private: unordered_map<char, int> need, window;public: bool checkInclusion(string s1, string s2) { for (char c : s1) need[c]++; int left = 0, right = 0, valid = 0, len = INT_MAX; while (right < s2.

2021-12-11 14:58:14 3169

原创 【困难】最小覆盖子串

class Solution {private: unordered_map<char, int> need, window;public: string minWindow(string s, string t) { for (char c : t) need[c]++; int left = 0, right = 0, valid = 0; int start = 0, len = INT_MAX; wh..

2021-12-10 13:54:04 731

原创 【中等】使数组互补的最少操作次数

本题不是纯粹的差分数组,只不过使用差分数组解决更快。设一个数组res,其中res[x]表示的是,nums[i] + nums[n - 1 - i] 为 x 的时候,需要多少次操作。所以这题就抽象成计算出所有的x中最小的res[x]即可。关键是,如何求出每一个 res[x] 位置的值,需要多少操作?为了叙述方便,假设 nums[i] 为 A,nums[n - 1 - i] 为 B,最终的 A+B 为 C。先假设res中所有数都是2,即都需要2次操作,然后在这上面进行筛选,注意这里的“所有数”表示范围[..

2021-12-09 17:18:14 513

原创 【中等】拼车

用示例1画图举例:注意这里[2, 1, 5]意思是有2个人从第一站坐到第五站,人在车上的站实际只有1到4,因为第五站已经下车了,[3, 3, 7]同理。然后发现在第三第四站车上的人数都超过了载人数4,所以错误。class Solution {public: bool carPooling(vector<vector<int>>& trips, int capacity) { vector<int> diff(1001, 0);..

2021-12-07 15:16:17 179

PDF阅读器安卓apk.apk

PDF阅读器,支持夜间模式,翻页阅读等等PDF阅读器,支持夜间模式,翻页阅读等等PDF阅读器,支持夜间模式,翻页阅读等等

2020-04-19

CSGO Demo Manager

搬运资源 分析csgo竞技战绩 并分析demo 可观察双方段位

2018-09-30

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

TA关注的人

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