自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一只老风铃

今已亭亭如盖矣

  • 博客(48)
  • 资源 (2)
  • 收藏
  • 关注

原创 Leetcode 连续乘积的极值-限制d范围内。

针对一个序列中抽取若干个数字,出来组合成子序列,有以下几类问题:①抽取出的子序列为最长递增子序列,通常以dp[i]表示i元素结尾最长子序列长度,进行迭代计算。②抽取的子序列乘积最大,该类问题:由于负数与之前一个最小值(负数)可能成为最大值,维护两个数组:dp1[i]表示以i元素结尾子序列乘积最大值 dp2[i]表示以i元素结尾子序列乘积最小值即 dp1[i+1]=max(dp1[i]*arr[i+1],dp2[i]*arr[i+1])问题进一步,复杂: 若对选取的个数限定为k ...

2020-09-30 10:16:08 300

原创 实现自己的静态链接库与动态链接库

静态链接库是指在源代码中调用库中的函数,再被编译为.o目标文件后,再链接上库文件,形成可执行程序。库文件中存放多个.o目标文件,它们存放着各个函数的定义,最终被一起链接进可执行程序。那么在运行期之前,可执行程序中就包含所有程序运行的条件,也就是所谓的静态链接。首先,新建两个.cpp文件 add.cpp sub.cpp 它们中都定义了两个简单的函数g++ -c add.cpp sub.cpp生成如下2个对象文件 add.o sub.o进一步,通过nm命令查看该.o文件...

2020-09-30 00:10:57 321 2

原创 编译期初始化与运行期初始化

编译期初始化:在源代码被编译过程中,编译期安插一些代码逻辑,完成确定的内存分配(并非实际分配内存,而是确定其大小占用,由编译期安插代码),变量的初始化。如:全局变量为内置类型,并且大小确定int a=2; static int b=3; //static的不同只是其只在本文件中可见static int c=a+b;在编译期初始化,那么在实际运行期都是确定的结构和逻辑,将带来更高的性能,因为编译器完成了一定的工作。加载时初始化:在main()函数执行前,完成包括全局变量,..

2020-09-28 22:53:59 2031 1

原创 Leetcode 分配数字

题目描述对于数据包,可能包含多条消息,每条消息前面加上一个长度,这在每条消息的前面附加一个 4 字节长度的 int 变量来存储消息的长度。对于长度恰好为 N 的字节的数据包,总共有多少种可能的不同的消息结构?我们定义不同为位置不同,和内容无关。比如说,对于长度为 10 的数据包,有下面 2 种可能的结构:| 4 | 6 || 4 | 1 | 4 | 1 |注意,在所有可能的结构中,消息的长度不可以为 0。也就是说,不能出现这样的消息:| 4 | 0 |。虽然牛牛很擅长写程序,但是他不擅长

2020-09-28 19:11:22 210

原创 pthread 多线程

多线程程序指的是在同一个程序中多个执行流并发执行,它们共享进程的同一个地址空间,分别完成相应的任务,并通过共享地址空间等方式完成线程间通信,CPU按照时间片轮转等方式对线程进行切换和调度。通常而言,线程共享的进程资源包括:线程之间共享内存地址空间中的堆区,也就是动态创建的区域 同时每个线程有自己的堆栈区,以进行函数调用和返回,局部变量的创建与销毁。 在进行线程切换时,每个线程依据相应的寄存器组保护现场和还原现场 线程共享进程打开的文件描述符(FD : linux中认为一切IO设备可采取文件描述

2020-09-27 19:00:06 924

原创 Leetcode 凑数字

题目描述牛牛今天逛商店,看到商店里摆着一些很漂亮的数字,牛牛非常喜欢,想买一些数字带回家。数字一共有九种类型,分别是1-9这九个数字,每个数字的价钱都不一样,而且每个数字的货源都非常充足。牛牛是个完美主义者,他希望用自己的能够承受的价格,从这些数字里面购买,并且凑到最大的数字带回家。示例1输入复制5,[5,4,3,2,1,2,3,4,5]输出复制"55555"说明第5个数字只需要花费1,所以买5个第5个数字可以凑到最大值55555。示例2.

2020-09-27 16:33:52 315

原创 关于static关键字与extern关键字

static关键字主要应用在三方面:第一:修饰一般变量或函数,此时该变量或函数将只能在本文件中被访问,而一般的变量(不加static)则成为全局变量#include <iostream>using namespace std;class A{public: A() { cout<<"A() constructor"<<endl; } ~A() { cout<<"~A

2020-09-27 01:28:05 224

原创 Leetcode 子序列计数

给定一组仅仅包含‘5’ ‘2’ ‘0’ 的字符序列,求有多少种位置不同的‘520’子序列?示例1输入复制"552200"输出复制8思路:遍历序列,采取sum5 sum2 sum0记录途中已知的以5结尾 以2结尾 以0结尾的子序列数量①由于5为要求的第一个,那么以5结尾的子序列数量,在每遇到一个5时 sum5++②由于2为要求的第二个,那么以2结尾的子序列数量,在每遇到一个2时 sum2=sum2+sum5即 当前2与之前所有的5可...

2020-09-27 00:52:50 289

原创 Leetcode 山字形序列_正反扫描

合唱团问题:给定一组身高不同的人,删除其中几个人,使得剩下的人组成先升高后减少的合唱团队列思路:正、反扫描left[i]表示正向第i个人为末尾的最长递增子序列 right[i]表示反向第i个人为末尾的最长递增子序列计算left[i]+right[i]便可找到最大的合唱团队列长度题目描述过山车在上坡下坡的过程是非常刺激的。如果把整个过山车的轨道当作是一个长度为n的数组num,那么在过山车上坡时数组中的值是呈现递增趋势的,到了最高点以后,数组中的值呈现递减的趋势,把符合这样先增后..

2020-09-25 23:15:22 922

原创 arp协议与icmp协议在ping中的应用

ping命令可以用于查询目标网络或主机是否可达,其内部实现依赖于arp协议与icmp协议。对于arp协议,其工作在网络层,实现IP地址到Mac地址的映射。协议报文的格式如下:那么PING命令具体如何执行:以同一局域网内host1 => host2 为例:首先host1查询自己是否有host2的ip-mac地址映射缓存,若有,结束若没有,那么对外广播ARP请求,请求包填充自身的IP地址、MAC地址、以及目标的IP地址,MAC地址填充00:00:00:...

2020-09-25 20:55:14 3172

原创 关于IEEE浮点数表示

计算机表示整数是精确的,这得益于任何一个整数都可以转换为若干个2的幂次方相加关于整数其主要包含两大类:无符号整数:以unsigned int 32位无符号整型为例:其表示的值是所有相应二进制位中为1的位对应2的幂次方相加因此表示范围为 0 =》2的32次方-1(32位中全为1) 不能表示负数有符号整数:以int 32位整型为例:第一位为符号位:表示 (若为1) 0(若为0) 记为k131位同无...

2020-09-25 11:49:50 1258

原创 linux g++ 编译流程

g++是GNU实现的编译器(包含预编译器 编译器 汇编器 链接器)预编译阶段:主要是文本操作 文本包含 文本替换(宏)文本剪切(条件编译)处理三大类预编译指令:条件编译 宏定义 文件包含hello.cpp #define MAX 1000int main(){ std::cout<<MAX<<endl; }执行预编译指令: g++ -E hello.cpp可以看到,并没有报错:即预编译阶段只进行文本处理,如宏M...

2020-09-25 00:53:26 1260

原创 boost/smart_ptr 智能指针

Java相对于C++,采取垃圾回收机制避免程序设计人员手动的进行动态内存的释放,其原理是采取引用计数和可达性分析判断对象是否被引用,并及时的回收这些不可达的对象。而C++ Boost库提供智能指针,也是采取类似的思想,将指向动态申请的内存空间的指针交由智能指针对象管理。智能指针对象通过引用计数等方法完成对所对应指针指向内存的管理。智能指针对象被存放在栈中,因此随着入栈出栈,智能指针对象的析构过程调用也伴随着其所指内存的释放。测试类:class test{private: i

2020-09-25 00:26:40 181

原创 Leetcode 滚动数组之01背包

01背包是经典的dp问题,其思路是考虑第k件物品的装入与否采取dp[k][n]表示前k件物品装入空间n的背包的最大收益dp[k][n]=max(dp[k-1][n],dp[k-1][n-v]+cost) 即该物品是否装入,注意(需要先判断空间是否足够装入)由于每次计算第k件物品,只会用到第k-1次的计算结果,进一步的优化思路,是采取滚动数组节约空间若迭代方向 size=> 0dp[n]=max(dp[n],dp[n-v]+cost)注意这里的迭代方向是从Maxsiz...

2020-09-24 21:10:12 418

原创 Leetcode 原地移动字母

题目描述给定一个只包含小写字母的字符串s,牛牛想将这个字符串中的所有'a'字母全部移动到字符串的末尾,而且保证其它字符的相对顺序不变。其中字符串s的长度<=1e6。示例1输入复制"abcavv"输出复制"bcvvaa"朴素的做法是分别叠加‘a’和非'a'到s1 s2 最后做一个合并若只能在原始空间上操作,不允许额外的空间复杂的,那么采取类似冒泡思想。若遇到'a'跳过若遇到非'a' 判断前面是否为‘a’ 若是,那么一...

2020-09-24 20:17:36 156

原创 ssl加密http协议

http协议是一种无记忆的协议,其基本形式是请求,响应,外层借助tcp协议实现数据传输。http协议包含请求报文和响应报文。请求报文:GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-

2020-09-23 20:02:28 961

原创 static_cast与dynamic_cast静态类型转换与运行期类型转换

类型转换是C/C++中重要的一种转换,对于内置类型的转换,其往往伴随着精度丢失或者转换失败。而对于继承体系中的类类型转换,可分为两大类别:向上转换:将派生类的指针引用转换为基类的指针或引用,根据里式替换规则,这类转换是安全的。 向下转换:将基类的指针引用转换为派生类的指针或引用,由于不确定基类指针实际指向,所以这类转换是不安全的。C++实现多态的核心是虚函数,其一种通俗的描述是:通过基类指针引用指向不同的子类,而采取统一地调用方法,虚函数机制能够确保根据实际的指向对象不同调用相应的函数。.

2020-09-21 18:10:27 637

原创 Leetcode 01矩阵中的最大子方阵

对于01矩阵中的最大子矩阵,其动态规划思路为:dp[i][j]=1+min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1])) 求解以(i,j)为右下角的最大子矩阵(并且该子矩阵内全为1)新的问题(子方阵只要求四条边为相同元素):题目描述有一个方阵,其中每个单元(像素)非黑即白(非0即1),请设计一个高效算法,找到四条边颜色相同的最大子方阵。给定一个01方阵mat,同时给定方阵的边长n,请返回最大子方阵的边长。保证方阵边长小于等于100。测试样例..

2020-09-20 12:10:12 1555

原创 Leetcode KMP算法之翻转子串

题目描述给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。测试样例:"Hello world","worldhello "返回:false"waterbottle","erbottlewat"返回:true思路:若s1经过翻转能得到s2 那么s1一定是s2+s2的子串考察s2="ABCD" s2+s2="ABCDABCD" 那么s1若能翻转到s2 那...

2020-09-20 11:07:42 164

原创 Trie字典树

字典树,顾名思义,存放大量单词的字典,将每个单词按照char分隔开,依次从根节点开始下降到某一节点,而路径则记录着单词的信息。其中每一个节点主要包含的信息有:int next[26] 其中next[i]=k表示引向字符'a'+i的边指向节点k(这里的k指的是下一个节点所在下标(若采取离散存储则是地址)) 若k=0 表示没有next边(因为0存放root节点) int sum;表示以该node节点为末尾的单词的数目(删除则sum-- 增加则sum++) int pre_sum; 表示...

2020-09-20 00:38:58 73

原创 多线程安全的单例:C++实现

单例模式要求只能产生一个该类的实例,因此采取的方法是禁用构造函数,拷贝构造函数,=重载操作符。禁用函数一般可以采取将函数放置于private acess section,同时提供static对外提供实例访问接口,在多种线程安全单例的实现方法中,还需要考虑多线程中的安全性:饿汉式:类一初始化时就完成instance的创建:...

2020-09-19 11:06:39 691

原创 关于“粘包”:字节流与数据报的区别

问题引入?如何处理和解决“TCP粘包”问题?即客户端调用两次不同的send试图发送两份不同的数据,但接收端调用recv时一次全部取出。无法分割出原先的两部分数据。关于传输层的两个协议其定义如下:UDP:用户数据报协议TCP:面向连接的可靠字节流传输协议TCP粘包是一个伪问题,需要明确的是:TCP基于字节流的可靠传输,每一个TCP分组包含一定的字节流,该分组需要由首个字节流指定接收端在接收到TCP分组后,根据字节流Seq序号,将其合并在缓存区。即TCP只负责将交由.

2020-09-18 09:48:03 1567

原创 关于约瑟夫环的递归思路

有n个人,编号为1~n,从第一个人开始报数,从1开始报,报到m的人会死掉,然后从第m+1个人开始,重复以上过程。在死了n-1个人后,问最后一个人的编号是?解法一模拟:采取一个dead[]数组,每次从一个没有死的人开始,活着的人依次报数(那么需要跳过dead[i]==true的人),到m处那个人去世同时计数num++ 当杀死num==n-1时,返回dead[]数组中为false的人下标+1易错点(下标)解法二递归:将n个人排开,第m个人奖去世=》子问...

2020-09-17 23:03:46 383

原创 关于编译器自动生成Default Constructor的4种必要情况

关于默认构造函数,有两点误区:对于任何一个没有定义构造函数的类,都会被合成一个默认构造函数 编译器合成的默认构造函数会设定Class中每一个data member的初始值编译器什么时候需要为Class生成一个默认的构造函数? : 需要的时候为了编译器需要,一些必要的构造函数被生成,它们之中有一些情况下是十分必要的,那么nontrivial(有价值的) default constructor被合成,主要包含4种情况:①带有Default Constructor 的 Membe...

2020-09-17 01:07:44 404

原创 预编译与编译

一C/C++源代码从最初的文本变为可执行文件主要进行三大步预编译阶段:主要是编译器执行代码文本处理工作,并不会进行语法检查主要执行三大类预编译命令宏定义:代码文本替换功能,将使用了宏的地方采取宏定义方式直接展开条件编译:代码文本剪切功能,根据设定的条件选择性删除一些代码片段包含文件: 代码文本插入功能 #include 包含其他头文件,#include其内部实现是将被包含的头文件代码插入到当前代码文本中编译阶段:将预编译阶段产生的带编译源码进行语法检查,编译成目标文件(.o类型.

2020-09-16 23:52:32 1627

原创 HTTP 请求方式与返回码

HTTP请求一共包含八种方法(动作)HTTP1.0定义了三种:Get Post HeadHTTP1.1定义了五种:put delete connect options traceget 请求服务器资源,请求参数将会显示在请求串中 post 向指定资源提交数据与表单,请求的数据被放置在请求体中,相对于get可以发送更多的数据 head 类似于get请求,只不过返回的没有实体,只有头部 put 向服务器发送指定的数据取代指定文档的内容 delete 删除

2020-09-14 23:14:23 624

原创 Leetcode 换钱最少货币数

题目描述给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。如果无解,请返回-1.输入复制[5,2,3],20输出复制4【思路】经典的dp问题,每一轮研究新的硬币k的加入,能否使得之前组配sum的硬币总数减少即 dp[sum]=min(dp[sum],dp[sum-k]+1) ①注意点:初始化dp[0]=0 dp[i]=...

2020-09-14 10:27:06 657

原创 Leetcode 最长累积和的子数组

题目描述给定一个无序数组arr, 其中元素可正、可负、可0。给定一个整数k,求arr所有子数组中累加和为k的最长子数组长度示例1输入复制[1,-2,1,1,1],0输出复制3【思路】采取,sum记录前k项目的累积和,sum[i]=sum[i-1]+arr[i]同时记录下 累积和为sum对应的下标 map[sum]=i遍历sum到第i个时, 当map.find(sum+k)存在时,即存在与当前点sum差值为k的累积和(可能拆分出一段子数组)...

2020-09-14 09:49:15 389

原创 C++ 对象内存模型

继承,封装,多态是面向对象的三大特性之一,以类为例,类分为数据成员和函数而函数分为static、非static、virtual函数三大类函数,那么一般的C++对象其内存模型是如何。类中存在部分:成员变量 静态成员变量 成员函数 静态成员函数 构造函数 析构函数 虚函数 虚析构函数 纯虚函数通常而言对于一个对象,其在内存中的模型不包含函数,只包含成员,而函数单独存放,所有对象通过地址进行调用。对象在内存模型及其占用大小受几方面因素影响:成员变量虚表指针虚基类表指.

2020-09-12 15:40:22 1551

原创 位方法 子集生成

题目描述请编写一个方法,返回某集合的所有非空子集。给定一个int数组A和数组的大小intn,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。测试样例:[123,456,789]返回:{[789,456,123],[789,456],[789,123],[789],[456 123],[456],[123]}【常规思路】先将源数组排序,排序的规则是按照从大到小(确保从前往后抽取出来的元素 也就是子集..

2020-09-11 18:58:06 282

原创 二分图的最大匹配-解决匹配问题

题目描述题目描述若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。输入:有一个正偶数N(N≤100),表示待挑选的自然数的

2020-09-11 15:33:12 914

原创 三次握手与四次挥手

网络协议栈,上层的实现基于下层提供的服务,体现在协议栈数据封装上,不断的用更底层的头部封装数据。最内部为顶层的应用程序数据,然后是TCP头部,IP头部,最后是以太网头部TCP协议提供面向连接的可靠的基于字节流的传输服务其头部基本格式如下:其中16位源、目的端口指明通信的双方端口32位序列号seq为所发送报文段的字节流的第一个字节序号32位确认号ack为接收方在收到发送方的字节流后,若其发送序号x 返回ack=x+1标记位:标记位每一个标记占用一个bit 也就...

2020-09-11 10:14:27 458

原创 strcpy memcpy strlen的实现

strcpy将一个const char* src指向的字符内存空间 复制到dst内存空间中,直到遇到'\0'结束符 同时'\0'结束符也被复制过去char* my_strcpy(char* dst, const char* src) //将src指向的字符串复制到dst中 直到遇到'\0'结束符{ if (dst == 0 || src == 0) return nullptr; char* res = dst; //最终返回首地址 while (*sr

2020-09-10 15:35:27 287

原创 bitmap 位存储实现海量数据的标记

针对海量的数据,一般的内存无法存储,提供一种位存储的标记方法?如给定10亿个数字,询问其中任意一个数字是否出现,采取传统的存储方式,以32位机器为例一个int占用32位,也就是4字节而bitmap的思想是,无符号int类型的范围是确定的 即0~2的32次方-1那么将一个int拆分开来看,其包含32个bit 若其中一个Bit为1那么标记原先的数字存在 那么对于一组int第一个int: 表示0~31这32个数字第二个int: 表示32~63这32个数字......对于任意...

2020-09-10 13:53:44 842

原创 unordered_map的实现-hashmap

C++STL中map包含两大类map:采取红黑树方式,map中的元素有序,读写都是O(LogN)的时间复杂度 unordered_map:元素无序,采取hashmap的实现方式,即连续存放的桶,数组+链表方式,一般的认为读写都是O(1)复杂度unordered_map是典型的采取空间换时间的方式达到一个良好的性能,初始化一定大小的vector(连续存储的数组)vector中index位置下标元素为一个bucket(桶) 针对一个(key,value)根据hash函数(常见的如 取模%)定.

2020-09-10 11:22:43 1437

原创 Leetcode 正、反向最长递增子序列-合唱团

题目描述计算最少出列多少位同学,使得剩下的同学排成合唱队形说明:N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,则他们的身高满足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>TK。你的任务是,已知所有N位同学的身高,计算最少需要几位同学...

2020-09-09 11:38:58 642 1

原创 计算机网络 ip地址分类与子网掩码

题目描述请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。所有的IP地址划分为A,B,C,D,E五类A类地址1.0.0.0~126.255.255.255;B类地址128.0.0.0~191.255.255.255;C类地址192.0.0.0~223.255.255.255;D类地址224.0.0.0~239.255.255.255;E类地址240.0.0.0~255.255.255.255私网IP范围是:..

2020-09-08 10:48:03 1254

原创 动态规划 分类01背包问题

题目描述物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:主件 附件 电脑 打印机,扫描仪 书柜 图书 书桌 台灯,文具 工作椅 无 如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有0个、1个或2个附件。附件不再有从属于自己的附件。每件物品规定了一个重要度,分为5等:用整数1~5表示,第5等最重要。在不超过N元(可以等于N元)的前提下,使每件物品的价格与重...

2020-09-07 12:04:03 690

原创 Leetcode 树的直径(树中最远的两个点)

题目描述给定一棵树,求出这棵树的直径,即两个节点距离的最大值。示例1输入复制6,[[0,1],[1,5],[1,2],[2,3],[2,4]],[3,4,2,1,5]输出复制11思路:从任意一个点出发找到最远的点P 从P点出发找到最远的点Q P Q之间的距离即为树中最远两个点距离证明:实现:采取基本的dfs 实现搜索最远的点,找到他们之后采取dfs 返回两者的距离int point_p; ...

2020-09-06 12:45:32 1666

原创 Leetcode 数字序列翻译

题目描述有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'。现在给一串数字,返回有多少种可能的译码结果示例1输入复制"12"输出复制2说明2种可能的译码结果(”ab” 或”l”)思路:对于一个字符,分析其能否单独翻译成一个单词,以及能否组合翻译成一个单词特别的: 对于含有0的数字,其只能够与前面的1或2组合成 “10” 或 “20”易错点:对于多个连续0 将无法翻译 对于...

2020-09-06 10:50:59 1870

计算机图形学-Bezier与Bspline曲线,曲面

MIT计算机图形学作业 C++实现,Bezier曲线,Bspline曲线

2018-01-05

正则式到最小化DFA

实现了从正则式子到NFA,NFA到DFA,并最小化DFA的过程,

2018-01-05

空空如也

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

TA关注的人

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