自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(285)
  • 收藏
  • 关注

原创 关于HTTP协议的简和通信过程

1. HTTP协议  首先HTTP协议是一个简单的请求-响应协议, 也叫作超文本传输协议, 在早期专门用于传输超文本数据html, 但是随着协议发展多元化, 开始不限制传输格式. 在TCP/IP协议栈当中, 它是运行在应用层上的协议. 它指定了客户端可能发送给服务器什么样的消息以及得到什么样的相应.注意: 这里我们要注意的是应用层是直面我们程序员的一层, 因为应用程序使我们程序员自己写的, 因此应用层的通信协议可以有我们自己来制定, 而HTTP就是一种知名的应用层通信协议.2. 关于HTTP的发展历

2020-09-23 18:42:44 1016

原创 谈一谈你所理解的TopK问题

       在实际的应用和工作当中, 我们经常会遇到在海量的数据当中寻找出前K个最大值或最小值的问题, 为了实现这个功能, 我们最先想到的方法可能就是排序, 在排序之后的序列当中取出前K个即可, 这样的方法确实可以, 但是存在一定的问题, 千万不要忘了这个问题的前提海量数据, 这就也就是说当数据规模过大内存放不下的时候, 我们再去使用常见的排序就无法解决.因此, 对于这种海量数据的TopK问题, 一种经常使用的方法就是借助堆去解决 使用堆

2020-09-02 19:43:52 289

原创 关于TCP建立和释放连接的三次握手,四次挥手及相关问题总结

为什么TCP建立与释放连接要进行三次握手和四次挥手?接下来, 我们将逐步对这个问题进行剖析.理解清楚TCP socket编程与三次握手和四次挥手的关系.对于服务器端来说, 我们首先创建一个socket, 接下来调用bind绑定服务端的IP地址和端口. 绑定端口是为了内核收到数据之后知道这个数据应该交给哪个进程, 绑定IP地址主要是由于机器上可能有多个网卡,需要选择监听哪个网卡. bind之后, 就要调用listen, 将服务端之前创建的socket转为被动套接字(也就是监听套接字). 之后调用acce

2020-08-07 19:15:31 1048

原创 代码实现LRU最近很少使用算法

LRU全称(Least Recently Used), 称为最近很少使用算法.意思是, 根据最近访问的记录, 对于缓存的数据进行淘汰, 如果一个数据最近被访问, 或者经常被访问, 那么它就会处于列表前面的位置(比如数组或者链表的前面), 而一个数据很长时间没有被访问, 就会处于靠后的位置, 这个时候缓存如果满了, 来了新的数据, 就会把处于尾部的数据淘汰掉, 并将新的数据放入列表.LRU算法通常是用一个哈希表和一个双向列表实现的其实就如我们之前在概念中提到的那样, 也可以是一个数组, 也可以是一个列表

2020-07-27 12:22:19 187

原创 使用多线程处理数据时的线程安全问题,同步与互斥的实现以及死锁的产生条件

线程安全首先我们要知道什么是线程安全!线程安全指的是多个执行流进行任务处理的时候对临界资源的争抢访问, 不会产生数据二义问题。为了实现线程安全,我们通常需要保证同步与互斥这两个条件。同步:通过条件判断保证对临界资源访问的合理性互斥:通过同一时间的唯一访问保证临界资源访问的安全性同步与互斥的实现互斥的实现互斥的实现我们通常是利用互斥锁互斥锁本身实际上是一个只有0/1(计数为1或者为0)的计数器,通过这样的计数描述当前临界资源的访问状态,所有执行流在访问临界资源的时候都需要通过该计数器判断当前

2020-07-25 20:27:57 245

原创 线程概念以及Linux下提供的线程控制接口

线程概念在早些时候, 我们学习进程的时候, 说进程就是一个pcb, 是操作系统对运行中程序的描述, 通过这个描述实现对运行中程序的调度执行, 然而现在学习线程, 线程其实是进程当中的一条执行流, 在linux下是通过pcb实现的, 因此我们说linux下的pcb实际上是一个线程, 并且这些pcb共用同一块地址空间, 这些pcb更加轻量化, 因此也被称作轻量级进程.实际上, 这个时候我们并不以pcb去区分线程和进程, 通常我们这样去理解:进程是操作系统资源分配的基本单位线程是cpu调度执行的基本单位

2020-07-24 18:20:00 132

原创 LInux下标准库IO接口和系统调用IO接口

标准库IO接口fopen;打开文件fread:对文件进行读操作fwrite:对文件进行写操作fseek:跳转文件读写指针位置fclose:关闭文件,对应于fopenstd::in : 标准输入std::out : 标注输出stderr : 标准错误fopen FILE* fopen(char* filename, char* mode); //filename是打开文件的名称 //mode是打开文件的方式 返回值是一个FILE*文件流指针, 通过这个指针操作文件打开文

2020-07-19 17:19:18 171

原创 Linux下的程序替换, exec函数族,以及利用程序替换实现一个简单的minishell

程序替换程序替换是指替换一个正在运行中的程序.我们知道, linux中进程就是一个pcb, 是对一个运行中程序的描述, 通过虚拟地址空间及页表, 将程序运行对应的数据及代码映射到物理内存, 程序替换就是pcb不变, 但是映射到物理内存的代码和数据改变成另一个程序.那么, 如何去理解程序替换呢?我们可以这样去思考, 当我们使用 fork()创建子进程之后, 子进程执行的是和父进程相同的程序(先不考虑根据返回值进行代码分流), 这个时候, 我们就可以在子进程当中调用exec函数来执行其他的程序, 如果这

2020-07-13 18:52:59 305

原创 Linux中进程概念相关, 进程地址空间

在了解进程地址空间之间, 我们先来看一段代码#include <stdio.h>#include <unistd.h>int gval = 1;//全局变量int main(){ pid_t pid = 0; pid = fork(); if (pid == 0) { //子进程会进入这个判断 gval=100;//在子进程当中修改这个全局变量的值 printf("child gval:%d---%

2020-07-11 20:35:04 179

原创 Linux下的进程优先级,环境变量及相关操作

进程优先级进程优先级就是指一个进程对CPU资源获取的优先权(权级其实就是一个数字),优先权高的就会优先执行。那么为什么要有进程优先级呢?因为配置进程的优先权对于多任务环境的linux非常有用,可以大大改善系统性能。通常情况下,我们较常遇见的有交互式进程和批处理进程。交互式进程:直接与用户进行交互的进程批处理进程:在后台默默做循环工作的进程一般情况下,要求交互式进程优先级较高,能够更加优先的被CPU处理(如果不这样做,用户的一个操作可能会响应缓慢,体验效果较差)因此,进程优先级最大的作用就是让

2020-07-06 21:06:10 359

原创 Linux下的进程概念,进程状态和进程等待

进程概念进程就是一个pcb(process control block),是操作系统对运行中程序的描述,通过这个描述实现对运行中程序的调度管理,Linux下pcb是一个task_struct结构体,task_struct是Linux内核的一种数据结构。task_struct结构体中的内容包括内存指针,上下文数据,程序计数器,进程标识符(pid),进程状态,优先级,IO信息等在知道进程概念的基础上,我们再来看一个进程的创建 pid_t fork(void);//创建一个子进程fork具有两个返回

2020-07-05 09:25:36 535

原创 如何理解C++中的继承, 多继承, 菱形继承以及继承中较为重要的知识点总结

首先, 什么是继承?继承的概念继承是指面向对象程序设计使代码可以复用的重要手段, 它允许程序员在保持原有类特性的基础上进行扩展, 增加功能, 这样产生的类, 称为派生类(也称作子类).这样讲了一大串, 其实核心的点就是:继承是类设计层次的复用(也就是针对类的代码复用, 让我们可以不用再去写一些重复度较高的类代码)举例来说明:举例之前, 我们先来看一下继承的定义格式class A{};//B继承了Aclass B : public A{};//其中A为基类(父类), B为派生类(子类)

2020-06-28 21:53:20 315 1

原创 详细阐述及推导将长度为n的绳子剪成m段,得到m段长度乘积最大值的剪绳子问题

问题描述:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例1输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1示例2输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 =

2020-06-21 22:42:48 1393 2

原创 典型动态规划问题, 连续子数组的最大和

题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)示例就拿{6,-3,-2,7,-15,1,2,2}来说连

2020-06-14 10:28:47 205

原创 数组中的第k个最大元素

问题描述在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。来源:力扣链接:数组中第k个最大元素思路:利用 priority_queue优先级队列, 建立k个数据小堆,将nums中剩余数

2020-06-07 22:16:41 227

原创 字符串相加, 大数加法

题目描述给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。注意:num1 和num2 的长度都小于 5100.num1 和num2 都只包含数字 0-9.num1 和num2 都不包含任何前导零。你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。来源:力扣链接:字符串相加思路:首先根据字符串 num1 和 num2的长...

2020-06-03 20:37:49 714

原创 关于C++的内存管理, 以及C++当中的 operator new和operator delete函数, 定位new表达式

在C语言当中, 动态内存的管理方式分为 malloc / calloc / realloc 和 freemalloc函数可以在堆上申请指定字节的内存空间, 申请成功返回申请到的空间的首地址, 如果申请失败会返回NULL.void* malloc(size_t size);注意malloc申请到的空间是没有经过初始化的calloc函数与malloc的功能相似, 但是calloc申请到的空间是经过初始化的, 初始化内容为0. void* malloc(size_t, num, size_t s

2020-05-25 21:31:53 289 1

原创 矩阵中的路径

题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一

2020-05-22 23:06:57 212

原创 求n项和, 不使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句

题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。代码示例:class Sum{public: Sum() { _sum += _i; ++_i; } static void Init() { _s...

2020-05-18 20:10:07 456

原创 字符串区间部分翻转

题目描述给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。示例:输入: s = “abcdefg”, k = 2输出: “bacdfeg”要求:该字符串只包含小写的英文字母。给定字符串的长度和 k 在[1, 10000]范围内。来源:力扣(LeetCode)链接:字符串区间部分翻转代码示例:class

2020-05-13 21:09:46 906

原创 关于C++当中泛型编程, 模板初阶(函数模板, 类模板)详解

C++泛型编程在C++当中, 泛型编程是一个十分重要的概念, 那么泛型编程到底是什么? 而它的作用及优点在哪里? 下面我们将一步步解释C++当中的泛型编程, 函数模板和类模板举个简单的例子, 在我们C语言当中, 如果我们想要实现一个交换函数, 比如下面这样:void Swap(int* a, int* b){ int tmp = *a; *a = *b; *b = tmp;}这...

2020-05-08 18:53:27 355

原创 翻转字符串中的单词

题目描述给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例 1:输入: “Let’s take LeetCode contest”输出: “s’teL ekat edoCteeL tsetnoc”注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。来源:力扣链接:翻转字符串中的单词思路:根据空格将字符串中的每个单词分...

2020-05-06 19:39:44 440

原创 C++当中提供的字母和数字相关的判断函数, 以及位运算对大小写字母转化的实现

字母数字相关判断的函数isalnum(char c) 判断是否为字母或者数字isalpha(char c) 判断是否为字母isdigit(char c) 判断是否为数字islower(char c) 判断是否为小写字母isupper(char c) 判断是否为大写字母...

2020-05-03 21:33:08 597

原创 合并两个排序的链表

题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。题目来源: 牛客网思路:整体思路而言, 就是双指针, 把每一个节点的值拿出来与要插入的链表比较, 也用到插入排序的一个思路, 只是将数组换成了链表最重要的是, 我们要插入一个节点就要注意相关节点的断链和链接具体的操作流程见代码及代码注释代码示例:/*struct ListNode ...

2020-04-29 19:47:06 107

原创 顺时针打印矩阵

题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路:通过分析其实不难发现, 在矩阵当中只有四条路可走:从左往右从上往下从右往左从下往上确定了这四条路...

2020-04-27 20:32:52 189

原创 二叉树的镜像

题目描述操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义:源二叉树镜像二叉树思路:递归思路, 交换当前节点左右节点, 递归左子树, 递归右子树.非递归思路,...

2020-04-26 21:10:22 94

原创 数值的整数次方

题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0.题目来源: 牛客网思路: 其中用到了快速幂算法, 还有需要注意底数和指数的关系问题特殊情况:1. base == 0时, exponent = 0, return 1; // 一般的将0^0看作1, 不必纠结2. base =...

2020-04-20 21:27:26 94

原创 链表中倒数第k个结点

题目描述输入一个链表,输出该链表中倒数第k个结点。题目来源: 牛客网思路:这里提供两种思路遍历链表得到链表结点总数 count, 得到count和k的关系, 基于这个次数关系再遍历链表找到目标结点;代码示例:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), ne...

2020-04-18 20:22:55 79

原创 二叉树的子结构

问题描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:首先实现一个函数, 判断两棵树的结构是否相同从数A的根节点开始, 递归左子树, 递归右子树, 逐个与树B进行比较, 当两棵树结构相同时, 说明树B是树A的子树代码示例:/*struct TreeNode { int val; struct TreeNode *left; ...

2020-04-16 17:56:40 135

原创 反转单链表

题目描述输入一个链表,反转链表后,输出新链表的表头。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNode* pHead...

2020-04-14 16:07:31 85

原创 根据二叉树前序遍历和后序遍历的结果重建二叉树

题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。题目来源: 牛客网思路: 递归构建二叉树代码示例:struct TreeNode { int val; TreeNode *...

2020-04-11 21:21:38 504

原创 调整数组的顺序使奇数位于偶数前面

题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。题目来源: 牛客网思路:主要利用插排的一个思路,根据插排思路, 默认第一个数为有序, 对应到本题就是无论奇偶.从下标为1遍历数组, 若为偶数什么都不做, 若为奇数则一次判断前面数字的奇偶性, 遇到奇数停止插入...

2020-04-10 20:26:29 74

原创 旋转数组的最小值

题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。题目来源: 牛客网思路:题目告诉给定的是一个非递减排序的数组的一个旋转, 例如数组{3,4,5,1,2}为...

2020-04-09 17:35:57 431

原创 从尾到头打印链表

题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。题目来源: 牛客网思路: 链表遍历, 不断头插链表遍历方法:for (cur = head; cur != NULL; cur = cur->next);代码示例:class Solution {public: vector<int> printListFromTailToHead(L...

2020-04-06 20:28:02 98

原创 替换空格

题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。题目来源: 牛客网思路:遍历字符串, 求空格数量, 字符串长度根据空格数量计算新字符串的长度利用新旧长度从后往前依次赋值代码示例:class Solution {public: void replaceSpac...

2020-04-05 21:04:05 88

原创 用两个栈实现一个队列

题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。题目来源: 牛客网思路:队列最重要的特征就是先进先出, 而栈是先进后出因此, 可以将数据全部压入栈1中, 实现push操作pop操作是为了删除栈底的数据, 可以将栈1中的数据依次取出压入栈2, 直至栈1为NULL, 此时栈2的栈顶数据则为我们需要删除的数据, 对栈2执行pop操作即可.最后将栈2...

2020-04-03 15:23:59 87

原创 二维数组中的查找

题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。题目来源: 牛客网思路:暴力搜索, 直接遍历二维数组.题目中告诉了每个一维数组长度相同,每一行从左到右递增每一列从上往下递增根据这个规则, 我们可以不用暴搜, 二维数组可以看作一个矩...

2020-04-01 19:01:46 112

原创 手动实现一个简单支持动态增长的栈

#include <stdio.h>#include <stdlib.h>#include <assert.h>typedef int DataType;//支持动态增长的栈typedef struct Stack{ DataType* _a;//数组 size_t _top; size_t _capacity;//栈的容量}Stack;...

2020-03-29 19:01:28 110

原创 二叉树遍历

题目描述编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。输入描述输入包括1行字符串,长度不超过100。示例输入:abc##de#g##f###输出:c b e g d f a题...

2020-03-28 20:21:03 166

原创 对称二叉树

题目描述给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:来源:力扣链接:对称二叉树代码示例:bool _cmpTree(struct TreeNode *p, struct TreeNode *q)//判断两个二叉树是否呈镜像对称的函数{ if (...

2020-03-23 21:02:04 92

空空如也

空空如也

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

TA关注的人

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