
知识点
日常积累
假如子弹换成糖果
混。
展开
-
KMP算法
KMP算法指的是字符串模式匹配算法,具体问题为在主串T中找到第一次出现完整子串P时的起始位置。目的:如果每次查到不匹配就从下一个开始查时间复杂度过高,利用子串相同的前后缀来优化查询匹配过程。手动计算的话next数组就是最大前缀后缀公共元素长度向右平移一格再减1。代码求解next数组最关键的一句话为当T[k] != T[j] 时令 k = next[k]这句话的意思若当前字符...原创 2020-04-13 23:46:32 · 133 阅读 · 0 评论 -
Makefile
在linux上用makefile编译一个hello.c文件,可用gcc编译器。gcc hello.c -o hello只能编译一个文件,非常不方便!首先,创建文本文档,取名Makefile(无后缀),#是注释!第一层:显示规则目标文件 : 依赖文件[TAB]指令第一个目标文件是我的最终目标!(.c—预编译—.i—编译—.s—汇编—.o—链接—.exe的倒叙)...原创 2020-03-25 23:41:32 · 273 阅读 · 0 评论 -
Git小结
版本控制也就是版本迭代目前流行的工具有Git、Svn(Subversion)版本控制的分类本地版本控制 :v1、v2、v3集中版本控制(单点故障问题):SVN分布式版本控制(每个电脑都拥有全部代码!安全隐患!):GitGit历史:Bitkeeper不提供给linux社区,李纳斯·托沃兹(Linus Benedic Torvalds,1969)两周开发了Git!官网下...原创 2020-03-23 22:44:53 · 124 阅读 · 0 评论 -
信号与进程
信号一、基本概念进程间常用的通信手段,如kill掉一个worker进程,master进程就会立即启动一个新的worker进程,信号用来通知某一个进程发生了某个事情(突发事情),所以进程不知道什么时候收到信号,也就是说信号是异步发生的,也被称为软件中断。【信号如何产生】某个进程发给另一个进程或发给自己 由内核(操作系统)发送给某个进程(ctrl+c 或 kill 或 内存访问异常 ...原创 2020-04-01 00:32:42 · 273 阅读 · 0 评论 -
阻塞、非阻塞、同步、异步
阻塞与非阻塞I/O阻塞和非阻塞主要是指调用某个系统函数时,这个函数是否会导致我们的进程进入sleep()(卡住休眠)状态而言的。1、阻塞I/O调用一个函数,这个函数卡在这里等待一个事情发生,只有这个事情发生了,这个函数才会往下走,如阻塞函数accept()。这种阻塞并不好,效率很低,所以一般不会用阻塞方式来写服务器程序。2、非阻塞I/O:不会卡住,充分利用时间片,执行效率更...原创 2020-04-09 22:20:45 · 323 阅读 · 0 评论 -
指针
this指针本质是一个函数参数,只是编译器隐藏起形式的,语法层面上的参数。this只能在成员函数中使用,全局函数、静态函数都不能使用this。 this在成员函数开始前构造,在成员的结束后清除。 this指针并不占用对象的空间。this相当于非静态成员函数的一个隐函的参数,不占对象空间。它跟对象之间没有包含关系,只是当前调用函数的对象被它指向而已。所有成员函数的参数,不管是不是隐含的,都不会占...原创 2020-03-29 23:36:01 · 486 阅读 · 0 评论 -
大端小端
小端:低地址低位,高地址高位!写个程序辨别系统是大端还是小端#include <iostream>using namespace std;union Test{ short value; char bytes[2];};int main(){ Test test_value; test_value.value = 0x1234;...原创 2020-03-29 01:10:08 · 152 阅读 · 0 评论 -
洗牌算法
非常惭愧知道的很晚。问题为:有一个大小为 100 的数组,里面的元素是从 1 到 100 按顺序排列,怎样随机的从里面选择 1 个数?最简单的方法是用rand()系统自动生成一个1-100的数,然后去数组找对应的位置即可。进一步,问题扩展为:有一个大小为100的数组,里面的元素是从 1 到 100 按顺序排列,怎样随机的从里面选择 50 个数?(注意数字不能重复!)...原创 2020-03-28 00:18:08 · 3683 阅读 · 1 评论 -
直接初始化与复制初始化
String s("abc")和String s = "abc"有什么区别呢?C++中的直接初始化指的是直接调用类的构造函数进行初始化(带括号的):String a; // 调用默认构造函数String a("hello"); // 调用参数为const char *类型的构造函数String b(a); // 调用拷贝...原创 2020-03-27 22:42:55 · 307 阅读 · 0 评论 -
内存对齐
C++空类的内存大小为1字节,为了保证其对象拥有彼此独立的内存地址。非空类的大小与类中非静态成员变量和虚函数表的多少有关(如果有虚函数就+4字节,无论有几个,虚函数可以看做是一个4字节的非静态成员变量,而且应该也是看虚函数出现位置的)。值得注意的是,类中非静态成员变量的大小与编译器内存对齐的设置有关。成员变量在类中的内存存储并不一定是连续的。它是按照编译器的设置,按照内存块来存储的,这个内存块大...原创 2019-05-06 15:23:25 · 182 阅读 · 0 评论 -
栈和堆的区别
一、程序的内存分配方式不同栈区(stack):编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。 堆区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。二、申请方式不同stack 由系统自动分配,heap 需要程序员自己申请。 C 中用函数 ma...原创 2019-05-08 21:33:16 · 61909 阅读 · 5 评论 -
数组与指针
摘自:https://blog.youkuaiyun.com/qq_22238021/article/details/79779574【注意事项】1、一个一维int数组的数组名实际上是一个int* const p类型,p指向第一个元素;2、一个二维int数组的数组名实际上是一个int (*const p)[n],p指向第一行;3、数组名做参数会退化为指针,除了sizeof,也就是说sizeo...原创 2019-04-30 20:58:31 · 527 阅读 · 0 评论 -
类型转换
隐式类型转换系统自动进行的,如int a = 3 + 4.5;显示类型转换(强制类型转换)//c语言风格int k = 5 % (int)3.2;int p = 5 % int(3.2); //函数风格的强制类型转换int l = 5 % (int)"def"; //这样写编译不会报错,但结果肯定不对【c++】强制类型转换通用形式:强制类型转换名<目...原创 2019-05-07 17:13:25 · 252 阅读 · 0 评论 -
new与malloc
基本概念【c】malloc/free从堆中分配/释放内存(malloc=memory allocation,malloc和free是函数)//标准void *malloc(int NumBytes); //NumBytes为要分配的字节数void *free(void *FirstByte);//例int *p = (int *)malloc(sizeof(4));free(p...原创 2019-04-30 17:26:40 · 321 阅读 · 0 评论 -
【面试】手写String类
类的构造函数、析构函数、拷贝构造函数、拷贝赋值运算符函数#include<cstring>#include<cstdio>class CMyString{public: CMyString(char* pData = nullptr); CMyString(const CMyString& str); ~CMyString(v...原创 2019-05-09 12:28:18 · 439 阅读 · 0 评论 -
大数据处理相关
题目描述一个网站有100亿url存在一个黑名单中,每条url平均64字节。这个黑名单要怎么存?若此时随便输入一个url,你如何快速判断该 url 是否在这个黑名单中?题目解析这是一道经常在面试中出现的算法题。凭借着题目极其容易描述,电面的时候也出现过。不考虑细节的话,此题就是一个简单的查找问题。对于查找问题而言,使用散列表来处理往往是一种效率比较高的方案。但是,如果你在面试中回...原创 2019-05-06 21:17:11 · 322 阅读 · 0 评论 -
常见的内存错误及对策
摘自:https://blog.youkuaiyun.com/u013457167/article/details/82814413常见内存错误1、内存尚未分配成功,却使用了它【解决办法】在使用内存之前检查指针是否为NULL,或者说,在使用指针之前一定要确保指针是有效的,即要进行指针有效性检验。如果指针p是函数的参数,那么在函数的入口使用assert(p != NULL) 进行检查,如果是用mal...原创 2019-05-09 17:32:11 · 367 阅读 · 0 评论 -
智能指针
定义将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型的需求),并在析构函数里编写delete语句删除指针指向的内存空间。new出来的叫裸指针,智能指针对裸指针进行了包装,能够自动释放所指向的对象内存。//复习类模板template<typename T>class myclass{public: T size = 100;};//ma...原创 2019-05-07 12:25:21 · 616 阅读 · 0 评论 -
gdb调试
gcc-g 为了调试用的,可以生产一些调试信息,加-g 是为了gdb用,不然gdb用不了。-o output_filename确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out,运行的时候直接 ./a.out 就能运行代码。示例为:gcc filename.c -o filename-c 只...原创 2019-05-11 12:03:22 · 312 阅读 · 0 评论 -
二叉树非递归遍历
先序对于任一结点p:1)访问结点p,并将结点p入栈;2)判断结点p的左孩子是否不空先while循环直到空,这其间要输出根节点值(因为是先序);这之后,取栈顶结点并进行出栈操作,令 p = 栈顶元素的右孩子(如果不为空循环,如果为空证明遍历完毕,会再取栈顶元素);3)直到p为NULL并且栈为空,则遍历结束。class Solution {public: vector<...原创 2019-09-14 17:08:49 · 226 阅读 · 2 评论 -
归并排序
Merge负责合并以mid为中点的下标从l到r的a数组中,mid以前和mid以后的两个小数组!void Merge(int *a, int l, int mid, int r){ int n1 = mid - l + 1; int n2 = r - mid; int *L = new int[n1 + 1]; //这里也可以用一个额外的数组,先把mid前...原创 2018-12-14 23:23:36 · 127 阅读 · 0 评论 -
安全相关
XSS与CSRF摘自:https://segmentfault.com/a/1190000007059639XSS:跨站脚本(Cross-site scripting,通常简称为XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。CSRF:跨站请求伪造(Cross-...原创 2019-05-06 11:10:48 · 182 阅读 · 0 评论 -
指针与引用区别
非空区别:在任何情况下都不能使用指向空值的引用。引用必须总是指向某个对象。不存在指向空值的引用意味着引用的代码效率比使用指针的效率要高。 合法性区别:使用引用前不需要检测它的合法性。指针总是被检测,防止其为空。 可修改区别:指针可以被重新赋值以指向另一个不同对象,但是引用总是在初始化时被指定了绑定的变量,以后不能改变,也就是不能被重新赋值,但是其内容可以改变。 应用区别:在以下情况下应该使用...原创 2019-05-05 21:29:27 · 146 阅读 · 0 评论 -
volatile总结
volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据,而且读取的数据立刻被保存。例如:...原创 2019-04-30 12:20:49 · 120 阅读 · 0 评论 -
堆
一、创建堆make_heap()生成堆,可以有两个参数或三个参数,前两个参数是指向开始元素的迭代器和指向结束元素的下一个元素的迭代器。第三个参数是可选的,可以用仿函数less()和greater()来生成最大堆和最小堆。vector<int> vec = {2,3,1};make_heap(vec.begin(),vec.end());//等价于make_heap(ve...原创 2019-02-18 21:09:23 · 134 阅读 · 0 评论 -
单例类写法
单例类作用:只允许一次生成该类的对象!#include "stdafx.h"#include<iostream>using namespace std;class MyCAS {private: MyCAS(){} //私有化构造函数,就不能用 MyCAS a; 这种语句成类对象了private: static MyCAS *m_instance...原创 2019-02-12 17:23:17 · 1279 阅读 · 0 评论 -
Linux下更改时间显示的时区
date命令用来查看当前系统时间其中:PST:【美国太平洋标准时间】GMT-8GMT:【格林尼治平均时间】(UTC)也就是英国时间CST:【北京时间】GMT+8若想把其他的时区设定改为北京时间:tzselect依次选择4Asia,9China,1Beijing,1Yes。最后:sudo cp /usr/share/zoneinfo/Asia/...原创 2019-01-11 22:41:07 · 985 阅读 · 1 评论 -
快速排序
数组排序void qsort(int *a,int l,int r) { if (l < r) { int q = partition(a,l,r); //返回的q为一次partition后返回的元素的下标 qsort(a, l, q - 1); //分别对前后排序 qsort(a, q + 1, r); }...原创 2018-12-17 11:05:15 · 151 阅读 · 0 评论 -
操作系统的位数决定寻址空间
32 位操作系统最大支持 4GB 内存(多装内存也没有用),64 位操作系统最大为 17179869184G,但是目前 64 位 windows 系统最大只支持 192G、128G,可用内存大小还与主板有直接关系,主板跟不上加内存也没有用。解释:在计算机中,一个地址存放一个字节(1B)的数据,所以 32 位操作系统的一个地址用 32 个二进制位表示,可表示的内存大小为 2 的 32 次方再乘 ...原创 2018-11-02 11:09:46 · 1830 阅读 · 0 评论 -
特殊运算符小结
例1:【LeetCode】136.只出现一次的数字给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?(本题难点!)示例 1:输入: [2,2,1]输出: 1示例2:输入: [4,1,2,1,2]输出: 4代码class Soluti...原创 2018-10-26 16:18:57 · 617 阅读 · 0 评论 -
sizeof 与 strlen 区别
sizeofsizeof本质是运算符,其值在编译时就计算好了,参数可以是数组、指针、类型、对象、函数等,它的功能是获得保证能容纳实现所建立的最大对象的字节大小。其返回类型为size_t,在头文件中typedef为unsigned int。具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:数组——编译时分配的数组空间大小;指针——存储该指针所用的空间大小(存储该指针的地址的...原创 2019-02-13 17:44:34 · 124 阅读 · 0 评论 -
select poll epoll
前提select、poll、epoll都是IO多路复用的机制,先是监听多个文件描述符FD,一旦某个FD就绪,就可以进行相应的读写操作。但是select、poll、epoll本质都是同步I/O,他们都需要在读写事件就绪之后自己负责读写,即这个读写过程是阻塞的。selectint select (int n, fd_set *readfds, fd_set *writefds, f...原创 2019-02-28 18:27:05 · 789 阅读 · 0 评论 -
【面试】手写函数合集
strcpy函数作用:把src的字符串放到dst的位置。char* strcpy(char* dst, const char* src) //该函数是没有考虑重叠的{ assert(dst); //当函数返回值不是void时用assert方便一些 assert(src); char* res = dst; while((*dst++ = *s...原创 2019-05-05 16:49:48 · 381 阅读 · 0 评论 -
exit
exit与returnexit(exiitCode):这个表示整个程序终止执行,也就是说在整个程序中,只要调用 exit ,就结束,并且可以返回一个数值给调用这个程序的环境,环境就可以知道这个程序执行的结果。exit为C++的退出函数,声明于stdlib.h中,对于C++其标准的头文件为cstdlib。return:一般是函数返回的结果,这个结果可以是int类型、short类型、bool类...原创 2019-05-03 16:27:11 · 934 阅读 · 1 评论 -
HTTP总结
简介HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。H...原创 2019-03-27 20:10:14 · 566 阅读 · 0 评论 -
HTTP与HTTPS总结
概述 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传...原创 2019-03-26 21:24:29 · 575 阅读 · 0 评论 -
extern总结
extern "C"在C++引用lua的头文件时,我们总会写成:extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h"}为什么要这么做呢?原因是C++的编译器会对程序中符号进行修饰,这个过程在编译器中叫符号修饰(Name Decoration)或者符号改编(Name Man...原创 2019-03-29 16:49:19 · 1005 阅读 · 0 评论 -
有符号数相关概念
原码、反码、补码假设有一个 int 类型(在计算机中占4字节,也就是32位)的数,值为5,那么,我们知道它在计算机中表示为:00000000 00000000 00000000 00000101数值(无论正负)在计算机中以补码表示!原码:正数直接转换成的二进制数,负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。比如 :00000000 00000000 0...原创 2019-03-25 17:48:17 · 1207 阅读 · 0 评论 -
多态与虚函数
一、什么是多态多态就是向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。也就是说,每个对象可以用自己的方式去响应共同的消息。使用相同的代码实现不同的动作,体现了面向对象编程的优越性。在C++中,多态就是利用基类指针指向子类实例,通过基类指针调用子类(虚)函数从而实现“一个接口,多种形态”的效果。简单的说就是,实现了一个函数会根据传入参数的不同有不同的功能,比如:vo...原创 2019-03-07 20:48:55 · 1065 阅读 · 0 评论 -
static总结
静态全局变量、静态局部变量和静态普通函数一、静态全局变量基本概念:代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的;常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”,数组的名字等) ;静态区(全局区):静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配,静态区的内存直到程序全部结束之后才会被释放;堆区:用mall...原创 2019-02-14 15:55:54 · 691 阅读 · 0 评论