- 博客(73)
- 收藏
- 关注
原创 考古题—剑指offer67:字符串转整数
以一个考古题开始新的一天,训练一下自己的代码能力,题意就不贴了,说下注意点吧:先除去开始的空格判断正负开头的0舍去溢出判断我做了两个,第一段代码没有经过优化,一遍ac,但是问题很多,所以优化了一下成了第二段代码,其中还是有class Solution {public: int strToInt(string str) { int len=str.length(); if(len==0) return 0; in
2020-10-29 10:06:38
327
1
原创 用户态和内核态—>虚拟地址映射
什么是内核态和用户态这是程序运行的两种状态。要理解这两个状态首先要理解用户空间和内核空间。Linux有4GB的地址空间,其中,0-3G是属于用户空间,3-4G是内核空间。用户空间一般运行应用程序,内核空间一般运行操作系统和驱动程序。两者之间自然不能简单地使用指针传递数据,这是后话,地址映射的关系了。回到我们的内核态和用户态。内核态和用户态的定义就从这里出发:用户空间下执行的程序状态叫用户态,执行在内核空间时叫内核态。状态区分两种状态其实就是两种操作系统的运行level。一般来说,以intel c
2020-09-24 09:38:57
1906
原创 supervisor是什么?
简介supervisor是python开发的通用进程管理程序,可以将普通的命令行进程变成后台daemon,监控进程状态,当进程异常退出时可自动重启。原理通过fork/exec来把被管理进程当作自己的子进程来启动,只需将supervisor的配置文件加上进程可执行文件路径即可。当子进程异常后,父进程可以准确获取子进程挂掉的信息,可以选择自己启动和报警。安装yum install supervisor使用主要是配置文件的修改,supervisor和子进程均需修改。具体参数可自己查阅supervi
2020-08-13 15:18:13
2517
原创 二叉树的最大深度——基础题复习系列
力扣原题分析:要二叉树的深度,那么就要往深度方向递归,每深一层,就将层数++,由于左右子树的存在,所以我们要将左右进行比较,max的加1。递归法:深度优先/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), rig.
2020-07-28 09:51:38
190
原创 手撕一个shared_ptr吧
智能指针的优点不多赘述,前面的文章已经说过。这次直接手撕一个智能指针的代码顺便帮助自己理解一下智能指针的使用。首先,智能指针有几个注意点:智能指针适用于各类型参数,所以要用T模板;智能指针有引用计数,所以在构造和析构的时候要进行引用计数的加减;需要重载指针的“->”“*”功能,使其能像正常指针一样使用;主要是析构函数的不同之处在于加个条件判断好,那我们开始吧:class Shared_mptr {public: //空类构造,count,ptr均置空 Shared_mptr()
2020-07-26 13:08:42
1235
原创 最长连续子序列(揭开乱序数组的统一思路)
题目:输入两行,第一行包括一个整数n(1≤n≤10^5 ),第二行包含n个整数,分别代表arr[i]。输出一个整数,代表最长连续子序列的长度。思路:所要的是连续的子序列。比如第一个里面是1、2、3、4,那既然是连续的子序列,排序就可以了。然后顺序遍历一遍找到连续的长度就可。这个解法属实普通,在面试的时候面试官一般还会让继续优化。重点来了重点来了重点来了重要的话说三遍,当数组问题的时间复杂度一般是nlgn,如果此时需要继续优化,那就是n。能完成On时间复杂度的数据结构首选哈希表。所以,此处我们
2020-07-22 10:00:33
1080
原创 go语言中=和:=的区别—带例子步步详解
在初学go语言的时候发现有时候用var声明变量类型,但有时候代码又经常直接用变量,不声明,让c++选手很是困惑,这是什么操作。因此我对比了下代码中的异同,发现:“=”的使用与其他语言相同,赋值操作,但是此处的变量必须提前声明好类型,或者在声明的同时赋值。“:=”的使用则类似于c++中的auto操作,自动匹配变量类型,省去了声明变量类型操作,也就是你可以不声明,在赋值使用的时候多加个冒号就可以了。尽信书不如无书,自己来做个测试:=package mainimport "fmt"func
2020-06-27 11:49:14
3048
1
原创 socket的那些事-字节序及网络下相关类转换函数整理(atoi,htons)
网络编程api中socket是一个很好用的工具,但是从字符或者数值到网络可以使用中间还是要有转换的。所以这一章用来总结一下socket编程中的那些转换函数。atoi最简单的一个函数,常见于:int port = atoi( argv[2] );atoi的作用很简单,其原型如下:int atoi(const char* str);很明显,就是将str所指字符串转换为int型整数。主机字节序和网络字节序首先解释一下这两个是什么:网络字节序(Network byte order):按从高到
2020-06-12 00:00:13
710
原创 来写一个shell脚本吧(入门级,步步深入)——文末有统计CPU占用率
昨晚突然有亲密人士要求帮我弄个统计程序CPU占用率的东西。于是乎,就查啊查,pidstat什么的,都没有很好用。于是自己写了个脚本,于是系列的记录下脚本的写法。啥是脚本首先他是个脚本,这不是废话。别急,我的意思是他不是专门的编程语言。还是在shell下执行某些命令而已,套了个脚本的新名字。脚本的出现是为了方便操作人员。我们在运维程序时,有时候会执行一些shell命令来查看程序运行情况,top之类的。但当一个程序运行时间较长,或者需要定时/经常查看运行情况,(是不是有点像上一篇makefile的说辞,两
2020-05-31 11:18:04
782
原创 makefile简易版-快速理解并上手
简介软件开发中,make通常被视为一种软件构建工具。它通过makefile/Makefile的文件来实现自动化构建。以target来查找相关文件之间的依赖关系(对比文件的修改时间来实现)。来一步步看我们假设要生成一个yan的执行程序,有一份main主程序,其次是123代码和一个头文件yan.h。gcc -o yan main.c yan1.c yan2.c yan3.c在开发和调试过程中,我们需要不断键入此命令。这样的话有两个缺点:一是耗时,需要不断重复这一个命令;二是如果我们修改了某个文件,此
2020-05-25 11:10:33
351
1
原创 数学来辅助做题——乘积最大子数组
多的不说了,和前几天的差不多,直接上题。给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。暴力:class Solution {public: int maxProduct(vector<int>
2020-05-21 16:01:51
246
原创 蛮特殊的动态规划——和为k的子数组
之前已经讲过不少动态规划,无非就是申请一个数组记录之前的结果。今天的每日一题之前虽然做过,但是复习的时候发现忘了思路。于是单独摘出来进行记录。先看题吧,一个很朴素的题。给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。题目:示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。思路:题目越短,思路越简单,优化越难。来看这道题,就是找连续子数组的和满足k就好了。最简单的方式,暴力遍历所有数组。
2020-05-17 09:55:17
530
原创 二叉树的层序遍历——bfs和dfs起始章节
在很多问题中,我们都要对所有情况进行遍历,二叉树是其中的一项,再比如矩阵类。正好每日一题做到了,就顺便拿出来总结一下遍历。概念性的东西我就不说了,直接说我的理解,bfs就是从此点往四周遍历,就像水波往外扩散,特点就是先近后远,适合最短距离这种的。怎么实现?队列,先进先出,离得近的先进,近的下一个进,循环。上本题。题目:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],3/ 9 20/
2020-05-14 10:27:07
424
原创 muduo网络库学习(三)
这章是做一个聊天服务器,聊天功能是一个最基础也最常见的功能。虽然简单,但是基本的设计思想和问题还是很全面的,我们来一步步分析。TCP分包TCP字节流协议上做应用层分包是网络编程的基本需求。分包在发送一个消息或者一帧数据的时候,通过一定的处理,让接收方能从字节流中识别并截取出一个个消息。其实就可以理解为标点符号,一堆文字不加标点符号(我今天不想出门去写了一个博客就不知道后面写什么了完全就是演...
2020-05-09 09:01:19
234
原创 最低票价——死磕动态规划系列
题目在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。火车票有三种不同的销售方式:一张为期一天的通行证售价为 costs[0] 美元;一张为期七天的通行证售价为 costs[1] 美元;一张为期三十天的通行证售价为 costs[2] 美元。通行证允许数天无限制的旅行。 ...
2020-05-08 16:14:17
330
原创 验证二叉搜索树——递归与循环的转换思想
题目给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。思路既然是二叉搜索树,那么我们比较的其实就是左右子树和根的值。上上篇文章我们说过链表的考虑,由于是单项指针,所以我们要记住上一个的节点值,才能在之后进行比较。很简单的思想就是递归,递...
2020-05-06 10:54:13
187
原创 怎么使用动态规划——最大子序和(leetcodeT53)
怎么样才能较快的用出动态规划,做了力扣的每日一题,复习一遍动态规划。任何情况下,暴力法都是最简单和最直接的思路。任何解题技巧或优化,都是在暴力的基础上进行优化。所以,如果不是很熟悉优化解法,不要一开始就直接想动态规划怎么做这个题。先用暴力想出来问题,然后优化时间空间。从下面这个题来解释。题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大...
2020-05-03 18:06:16
233
原创 指针在链表中——合并两个有序链表(链表头结点)
本来是个简单的题目,但是温故而知新,从指针的角度来重分析一下此题。题目:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路:链表和二叉树是最常见的指针题,说到底无非就是指针指向问题。在实际的应用中,指针...
2020-05-01 13:51:51
1324
原创 muduo网络库学习(二)
这章开始,正式进入网络库代码的学习。TCP示例作者举了五个TCP例子,用来讲解上章提到的三个半事件,以及muduo的编程思路。为方便,将上章所述的三个半事件摘了过来。连接的建立,服务端接受和客户端发起,连接后两者即对等,可以互收发数据。连接的断开,消息传递完毕的主动断开和被动断开。消息到达,文件描述符可读。对此事的处理就是网络编程性能的区别所在。也许应该是3.5,消息发送完毕。数据写...
2020-04-30 11:24:25
274
原创 muduo网络库学习(一)
前几天忙了下科研的事情,抽出空来继续学习一下muduo,本章开始正式学习muduo网络库,一点点深入linux多线程服务器的内部。好了,加油,开始了。TCP编程本质基于事件的非阻塞网络编程是高性能并发网络服务器的主流模式。其实之前的博文已经提到过reactor模型。简单来讲就是:注册某个事件的回调,当这个事件发生时,网络库会调用此函数,直接将事情为自己所用,进行内部处理。作者认为,TCP做了...
2020-04-24 12:14:28
671
原创 《Linux多线程服务端编程》——高效的多线程日志
什么是日志?我也问过自己。字面意思,记录东西的。之前面试的时候,面试官问过我,一般程序出了问题怎么调试。最常见的莫过于断点,或者我们在编程的时候条件判断响应的输出。但是这个东西在代码量小的时候是可以的,如果我们的东西很大呢,分布式的呢,几十万行的代码,也都断点吗?日志其实就是输出的加强版,我把运行过程的信息记录下来,这样我只需要查看日志就能知道干了什么事,发生了什么。正式开始,以上仅代表个人...
2020-04-15 17:22:11
829
原创 链表相加问题——栈,力扣445T
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例:输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 8 -> 0 -> 7思路:加法是从低位加起的,所以对于链...
2020-04-14 23:32:48
235
原创 《Linux多线程服务端编程》笔记——C++多线程系统编程精要
今天顺着读了第四章,同样跟着老师的角度梳理多线程的问题。前面老师分析了一些编程的细节问题,比如线程安全和创建销毁等问题,不详述。多线程与IO这个是之前博文聊过的东西,但没有深入。现在重新拿出来说一下。多线程网络编程的IO处理是个值得讨论的事情:如何IO,能否多个线程同时操作同一个文件描述符。答案自然是否定的,由于多线程的操作进度和效率未知,所以我们无法知道其先后顺序。所以会出现一些难以解决的...
2020-04-13 11:56:27
667
原创 搜索旋转数组——二分的深入锻炼
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], targ...
2020-04-12 23:56:39
136
原创 《Linux多线程服务端编程》笔记——多线程服务器的适用场合和常用编程模型
最近在进修muduo,于是配套陈硕(大神老师,直接开头指出,之后就不写引用参考了,有兴趣的直接搜就可以了)的书一个起来学习,真的是不怕知识多,就怕知识乱。之前很多都是用到什么学什么,最多看一下相关的东西。读过书之后才发现自己的知识体系不够系统,因此边读边把有用的部分记录在此。前两章的东西是线程安全和线程同步,之前在我的博客里陆陆续续提到很多,所以不另外做笔记。这是第三章的东西,从设计的思想开始剖...
2020-04-12 15:56:11
605
原创 多线程的利器——C++智能指针
C++给程序人员提供很多的权力,自然也就要完成很多的任务。最典型的就是C++的内存没有自动回收机制,所以要求程序员每次new&delete,不匹配则容易造成内存泄漏。因此C++引入智能指针,是RAII(利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取...
2020-04-11 23:07:58
950
原创 HTTP协议——具体解析
之前介绍过http的基础知识,这章来继续探讨一下具体组成。为之后自己写web服务器打个基础。简介超文本传输协议,具体的看我之前的博客:HTTP协议。HTTP通常是作为应用层的协议。HTTP协议承载于TCP协议之上,有时候也承载在TLS/SSL协议层之上(HTTPS)。工作流程回顾一下工作流程:客户端连接到web服务器:客户端与服务器的http端口建立TCP连接。客户端请求:通过T...
2020-04-11 17:54:54
233
原创 洗牌算法——优雅地有逻辑地打乱数组
早晨例行复习排序的时候突然想起了之前被问过的一个题,打乱一个数组,越乱越好。其实之前也听说过,貌似叫洗牌算法,当时答了上来,每次都产生一个此位置外的随机数,交换,然后往后循环此方法。但是不够严谨,其实可以逻辑严谨一点。我要保证每个数不在原先的位置,那我可以顺序来搜索这个数组,比如在n位置,我就找个n-1里的数字和他交换。此时n位置一定不是原数,同样,n-1时找n-2里的随机数,交换。代码非常...
2020-04-11 10:23:13
340
原创 回溯算法--深夜回溯>-<
顺着昨晚的组合总和题,今晚继续说一下回溯算法。我也看不懂官方定义树什么的。通俗来讲就是你从一个路口出发,最终到达某个地方,中间有很多条道路和岔口,每个路的终点都算一个结束,但并不都是一个解。我试着先以动态规划来讲一下,动态规划就是你在路口的时候就规划,下一步会到达哪个路口,然后继续规划,这样就能按你的思路去到达你想去的地方。回溯没这么聪明,他就顺着这个路走,走到发现不对,退回岔口,选另一条路...
2020-04-10 00:18:41
175
原创 再论epoll
之前已经讲过IO复用,这次重新拿出来还是因为服务器的高并发处理。将epoll再进行一次深挖。**情景:**假设此时有100万个用户和一个进程保持着连接, 但并不是所有的都会在一个时刻活跃,也就是说某个时间内只有少数的用户是活跃状态。select和poll对此的处理就是全部轮询,但是可想而知,效率低下至极。而且需要将这100w个连接进行用户和内核之间的拷贝,消耗内存。所以,select和poll并...
2020-04-09 21:53:25
141
原创 回溯起始篇——力扣39T组合总和
题目给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [2,3,6,7], target = 7,所求解集为:[...
2020-04-08 23:40:06
136
原创 muduo前站之观察者模式
作为设计模式之一,观察者模式有必要提前了解一下。what先来官方版:定义对象间一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知。这种交互也叫发布-订阅。目标是通知的发布者,他发出通知的时候并不需要知道谁是他的观察者。(最后这一句话之后可能会有歧义出现,之后再讲。先记一下。)还是用例子解释比较简单一点...
2020-04-08 21:37:47
351
原创 libevent小总结
前面对各个模块进行简单的源码分析,这篇从整体的角度对所有知识进行一次梳理,细节的部分不介绍,源码可自行翻阅之前的博文部分。通过总结,对libevent的整体设计和使用思路进行理解。reactor模式还是先说reactor模型,libevent采用的是事件回调机制,也就是reactor模式。正常的事件处理是通过应用程序调用某个接口触发某个功能。reactor相似,但是又不同。它需要我们提前将这些...
2020-04-07 16:22:18
258
原创 emm,动态规划(三)
为什么要在深夜写这篇博文,其实没什么,就是力扣的每日一题hard难度的动态规划搞到我了,我用下午写完上篇动态规划的心态和自信去帮你们验证了下动态规划到底难在哪里?嗯,难在状态转移方程,如果你想不出状态转移方程,就无缘动态规划了。而这个东西吧,又不能一步教到位,只能自己慢慢悟。有兴趣可以去看leetcode《编辑距离》题,动态规划的状态转移方程的高深拆解,这就叫实践与理论的差异,就不写解题思路了。...
2020-04-06 23:20:23
175
原创 动态规划(二)——通俗理解DP
来继续聊聊动态规划,前面已经讲过一次动态规划,动态规划(一)。还是先来解释一下什么是动态规划,繁琐的解释看上一篇,这一篇以尽量通俗的说法来继续动态规划。毕竟,看山是山看水是水是第一层,我们既然是二,就要到第二层,看山不是山,看水不是水。什么是动态规划?怎么用最简单的方式来告诉一个人动态规划是什么?1+2+3+4=?想了4想后,10~那1+2+3+4+5=?立马,15!?为什么这么快...
2020-04-06 17:07:49
331
原创 libevent源码分析(五)——IO多路复用
之前就已经讲过IO模型,也大致讲了一下reactor模型。现在我们回到源码中,来看下IO复用在libevent中的具体使用。之前说reactor的核心是事件驱动、同步非阻塞,这就需要采用IO多路复用。我们之前说过,libevent是跨平台的,也展示过他跨平台的技术。这节单独拿出来再聊一下。eventopstruct eventop{ const char *name; vo...
2020-04-05 16:06:34
242
原创 libevent源码分析(四)——timer集成
之前说过了signal的集成处理,我们二补的时候已经分析过timer的集成,现在简单看一下libevent的方法。集成到事件主循环之前我们分析过,select和epoll等都允许程序制定一个最大等待时间timeout,即使I/O没有发生,也能保证timeout后返回。我们把timer事件的最小超时时间来设置timeout,这样IO返回的同时,timer就绪事件也被激活,这样就可以将timer...
2020-04-05 11:46:40
214
原创 蚂蚁掉落问题
偶遇一个有意思的编程题,其实是个智力题。问题:n 只蚂蚁以每秒1cm 的速度在长为Lcm 的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。对于每只蚂蚁,我们知道它距离竿子左端的距离xi,但不知道它当前的朝向。请计算所有蚂蚁落下竿子所需的最短时间和最长时间。思路:看到这个问题的第一反应是推极端,最短时间是极端情况,最长时间也是...
2020-04-04 17:58:06
1267
原创 字符串转整数(力扣第8T)
题目:请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。该字符串在有效的整数部分之后也可能会存在...
2020-04-04 17:17:38
187
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人