自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode刷题记录-day15

leetcode刷题记录-day153783803823843863903953973781.之前有类似的题目可以参考,其实这道题就典型的二分查找,关键函数如下: bool check(vector<vector<int>>& matrix, int mid, int k, int n) { int i = n - 1; int j = 0; int num = 0; while (i >=

2020-07-23 00:03:20 389

原创 leetcode刷题记录-day14

leetcode刷题记录-day143693703723733753763691.本来我还想和他折腾一下,计划着先将这个链表翻转,然后再加1,最后再翻转回来,现在看来完全不必。2.直接读取这个链表的数据,然后转成整数计算,最后给这个链表重新赋值即可。3.当然,不可直接转为int计算,而应该在字符串上计算。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *n

2020-07-22 00:17:48 194

原创 leetcode刷题记录-day13

leetcode刷题记录-day133383433473483513553563573603613653663683381.这道题的考察次数还可以,解法比较简单,找最低位1,然后将其置为0,dp就完了。3431.这道题的解法也很简单,就直接dp就完事儿了。2.切记,先让details[0] = 0,咱们就直接让数字和index下标匹配,就好了。且,details[2] = 2而不是1啊!!!因为别人拿到2以后完全可以不用分解啊,同样的道理,details[3] = 33471.考察次数非

2020-07-21 09:50:30 231

原创 leetcode刷题记录-day12

leetcode刷题记录-day123003043073093183193223233243253283313323333343001.这道题说实话有点爆炸,考察的频率特别特别高!!!(字节跳动17+)2.我首先就想到了dp,这样一来,时间复杂度就成了O(n2),满足了题目的初始要求。3.在进阶要求中,时间复杂度要进一步降低,所以咱们还得继续思考。用的方法是贪心+二分查找。首先维护一个d[i]数组和一个lengthMax元素,然后遍历nums数组,遇到比d[lengthMax]大的就直接添加到末尾

2020-07-19 09:46:57 190

原创 leetcode刷题记录-day11

leetcode刷题记录-day112552592602612642672772792802812842852862872892942551.有一说一,大厂考察的次数很少,题目也非常简单,就dfs就完事儿了,还记的之前的那个简单的版本么?直接给你一颗二叉树,这里完全可以根据前序遍历构造出来。2591.大厂考察的次数非常少,僵硬。2.思路其实就非常简单,就直接先排序,然后固定第一个指针,接着让第二个指针指向后一个,第三个指针指向末尾,然后让第三个指针向前移动,直到满足和小于target,然后第二

2020-07-18 09:22:06 190

原创 leetcode刷题记录-day10

leetcode刷题记录-day102222232272282292302362382402221.字节跳动考察过非常多次!一定要认真复习一次!2.做法其实就是二分法,实现步骤我直接上代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x

2020-07-17 00:19:07 195

原创 leetcode刷题记录-day9

leetcode刷题记录-day91791861871992002012072082092102132152162211791.非常棒的一道题,我要吹爆!微软和字节跳动考察的频率很高的!2.这题其实就是重新排列一下vector,排序方法是:对于输入的两个字符串,分别用A+B和B+A进行比较即可,相等请返回false(不要返回true谢谢)bool compare(const int& data1, const int& data2);class Solution {publi

2020-07-16 00:18:36 176

原创 leetcode刷题记录-day8

leetcode刷题记录-day81481501511521531561591611621631651661731481.这道题的题解全部都是用归并排序完成的,而我使用的则是快速排序,也还不错,记得使用一个fakeHead(吹爆这个idea);2.这是微软面试最喜欢问的问题,建议复习时再多看一遍,pass1501.这道题微软没有考察过,不过其他外企考察的挺多的。2.做法上,逆波兰表达式的处理方法是遇到数字就push进去,然后遇到操作符就pop两个出来,然后执行运算(这里一定一定要切记,是顶上

2020-07-15 00:02:05 149

原创 leetcode刷题记录-day7

leetcode刷题记录-day71331341371381391421431441461471331.我的思路是:bfs。首先维护一个details的queue,不断的将新的元素加入。另外还需要维护一个map<int, Node*> visited,这个东西其实就是我已经安置好的表,根据int可以直接追查到指针。2.复习题目时建议认真回顾一遍实现流程,还是挺不错的一道题。1341.感觉官方题解的方法有点没太看懂,我直接就暴力解决了。至于解决循环下标的事情,直接就%即可137

2020-07-14 09:37:45 176

原创 leetcode刷题记录-day6

leetcode刷题记录-day61021031051061091131141161171201271291301311021.看看通过数量就知道了,这道题是真的简单。直接就广度优先,然后每次搞queue的时候都记得先记录一下当时的剩余数量,这就是完整的一层好吧。没啥corner case考虑。103我也是醉了,这道题后面你看个思路即可。非常简单,就是在上面一道题的基础上加上一个标质量,判断一下是否需要翻转向量即可,僵硬。pass!1051.这道题真的可以说是我日思夜想的题目,之前一直

2020-07-13 08:27:19 162

原创 leetcode刷题记录-day5

leetcode刷题记录-day58081828689909192939480怪有趣的一道题,主要还是思路吧,其他的就没啥了。1.对于去除重复次数超过2的元素,其实可以用一个标记,当前面出现重复时,下一个一定不能重复,否则就删除。2.对于删除操作,其实也很简单,你就假设你下一个要比较的元素前面有一片待删除的池子,用一个delLength来维护,每次判断元素如果需要删除,则delLength++;否则交换此元素和池子的第一个元素,冲冲冲。811.对于有重复元素的数组,那么最简单的办法就是先遍历

2020-07-11 21:48:06 156

原创 leetcode刷题记录-day4

56

2020-07-10 12:07:45 155

原创 leetcode刷题记录-day3

leetcode刷题记录-day3333436394033说一下我遇到的问题:1.这题我超过了20分钟才ac,很僵硬2.题目没有明确说明这是一个无重复元素的数组,因此前期做了不少工作处理这种情况;3.二分法写的有毛病,切记二分法一定是while(rightIndex >= leftIndex),然后移动leftIndex或者rightIndex时一定要记得是midIndex +1或者-134这道题就没啥好说的了,直接pass。361.注意,直接按照9行+9列+9块进行27次检查

2020-07-09 20:35:24 148

原创 《Effective C++》读书笔记-前11个tips

《Effective C++》读书笔记前言tip1-将C++看做语言联邦tip2-尽量用const、inline、enum替换#definetip3-尽可能使用consttip4-对象先初始化再使用tip5-了解C++帮咱们实现的默认函数tip6-如果不想使用默认生成的函数,请显式拒绝tip7-为多态基类声明virtual析构函数tip8-别让析构函数抛出异常tip9-不要在构造函数和析构函数中调用virtual函数tip10-令operator=返回一个reference to *thistip11-在o

2020-07-09 00:28:58 121

原创 leetcode刷题记录-day2

这里写目录标题192224293119这道题就很简单了,注意两点:1.用双指针方式;2.后指针要记得指向待删除节点的父亲节点(之前我是想,单链表删除节点的话,直接将待删除节点的后继节点内容放置到待删除节点处,然后删除待删除节点的next。)上述提到的删除方法其实是可取的,两种方法都不错。22也没啥难度,就是单纯的dp动态规划即可。corner case的话,考虑当n=0时,是不能加入空字符串的。241.首先应该把head以及head->next给处理完成,因为这涉及到返回头指针;

2020-07-08 12:04:07 241

原创 leetcode刷题记录-day1

leetcode刷题记录前言1122311151618前言今天开始Leetcode刷题,标准是medium耗时不超过20分钟,超过的话做标注。112题干比较简单,首先想到了将首部节点一层层传递给下面的孩子节点,最后判断当遇到叶子节点时做判断。corner case需要考虑root节点为nullptr。未超时。2思路还是很简单的。corner case处理的不好,首先是忘记了,我已经加过第一个数了。(这里题目保证会有第一个数)其次,while循环的时候我忘记了自增l1和l2的循环变量。最

2020-07-08 01:11:31 121

原创 最小生成树详细解析-包教包会

最小生成树详细解析-包教包会定义求最小生成树的两种方法Kruskal 克鲁斯克尔算法Prim普里姆算法总结定义原谅我对最小生成树的定义其实都是很模糊的。对于上面图左侧,这显然是一个带权重的无向图,而右侧的含义是,对于n个图节点,只用n-1条边就能将所有的节点连接在一起,哪怕再多加一条边,就会生成一个环。我们将这样的图生成的树叫生成树。对于连通图而言,它一定有生成树,且有可能,存在多种生成树。我们将生成树中这n-1条边的权重和最小的那个生成树,叫做最小生成树。求最小生成树的两种方法首先咱们贴上原

2020-07-05 20:47:41 372

原创 C++ struct、union、class内存对齐问题解析

C++ struct、union、class内存对齐问题解析前言struct、class与union内存对齐原则pragma pack(n)前言都不是很想将其归入到C++专栏,算了。struct、class与union内存对齐原则结构(struct)或联合(union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存

2020-07-04 18:27:25 288

原创 操作系统页面置换算法-看了也就差不多懂了

操作系统页面置换算法前言什么是页面置换算法解决方法先进先出页面置换算法(fifo)最佳置换算法(opt)LRU算法前言不多说废话了,不是很了解这个算法是干啥的,现在开冲。什么是页面置换算法很简单,咱们还是看看严格的定义好了。在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。很显然,这是进程遇到的困难,是操

2020-07-03 18:47:15 208

原创 大端模式和小端模式-以前犯过这样的错误

大端模式和小端模式-以前犯过这样的错误前言大端与小端分个类吧为啥要分模式如何检测大小端模式我个人遇到的问题前言之前的项目中接触过这个问题,但是实在是难以记忆,咱们就当做是重新学习好了。大端与小端定义其实是很简单的,大端就是咱们习惯从低地址看向高地址时的阅读顺序,我举个32int的例子好了,从低地址到高地址分别是高位字节和低位字节。小端模式就反过来,懂?分个类吧像我工作中使用的ARM芯片,默认是小端模式(就是读起来不顺畅),但是可以在程序中设置CPU的某些寄存器,实现大端模式和小端模式的切换。也就

2020-07-03 17:44:36 255

原创 尝试讲解一下python的垃圾回收机制

尝试讲解一下python的垃圾回收机制前言refCount环形引用标记-清除何时执行GC分代回收总结前言今天是学习python的第一天,我是突然想起来,凯酱那段时间学习python的时候专门学习了垃圾回收机制,当时在出校园的路上和我绘声绘色的描述。今天咱也将它搞清楚。refCount网上找了一段据说是python在声明变量时的底层结构代码: typedef struct_object { int ob_refcnt; struct_typeobject *ob_type;} PyObject

2020-07-02 23:01:52 126

原创 Python快速上手-从Pycharm开始(1~9)

Python快速上手-从Pycharm开始前言pycharm刷题方针实例001:数字组合实例002:“个税计算”实例003:完全平方数实例004:这天第几天实例005:三数排序实例006:斐波那契数列实例007:copy实例009:暂停一秒输出总结前言下面介绍的这一些练习题都是取自link,侵删。pycharm首先去官网下载一个pycharm,链接是link.OK记得安装Community社区版本,这个是免费的。启动软件,我们解释一下:这里需要简单配置一下环境。new environment

2020-07-02 17:40:51 465

原创 C++11 adapter介绍

C++11 adapter介绍前言粗浅的理解容器适配器迭代器适配器1.插入迭代器适配器2.反向迭代器适配器3.IO迭代器适配器仿函数适配器仿函数STL的仿函数仿函数适配器为啥count_if只接受一元函数参数前言适配器这个概念我其实直到现在都还没有理解,不过我在刷面经的时候偶尔能看到这个面试点,所以咱们就一起来看看。(C++就是这样啊,真的会问的非常深入的)粗浅的理解容器适配器这还是在看完了ccyanxyz的文章后才豁然开朗。首先呢,adapter不仅仅只有容器适配器,它有约三个大的方面,分别是容器

2020-06-29 14:19:40 498

原创 介绍一下https的内容-基本上看完就差不多了

介绍一下https的内容-基本上看完就差不多了前言httpshttps请求回应流程为什么是对称+非对称讲讲TLS前言这次总算是可以开始介绍https协议了。刚刚写好了需要了解的对称加密和非对称加密算法,再读这篇文章的时候你应该就不会觉得难以理解。冲冲冲。https其实https相较于http,就多个安全传输security。我放个图给各位看看在层次模型上两者的差别。直观的看,https = http+(SSL或者TLS)。https请求回应流程1.首先,这个https服务器必须得是有数字CA

2020-06-27 23:55:17 705

原创 对称加密与非对称加密(RSA)

对称加密与非对称加密前言对称加密非对称加密神奇的问题前言这是我学习https遇到的问题。我刷面经的时候在好多地方都看到了面试官问一些https的知识,搞得我很难受,根本就不懂啥是https,只知道它比http安全,但究竟是怎么个安全法,不晓得啊。网上说它用了加密算法,那咱们就一起了解一下,加密算法里都有哪些东西。对称加密啥叫对称加密呢?其实很好理解。这是最开始被使用的一种加密算法。假设A和B要一起传递一些消息。但是总有一些人会偷偷监听他俩的消息,比如A对B说:我的银行卡号是xxxxxxxx,密码是

2020-06-27 16:01:31 1380

原创 system design之大数据

system design之大数据前言有一个无限的整数数据流,如何从中随机地抽取k个整数出来?如何计算数据流中不同元素的个数?寻找数据流中出现最多次数的k个元素给定一个无限的整数数据流,如何查询在某个范围内的元素出现的总次数?更正前言为了应对微软的面试,然后看了其他老哥整理的博客,自己也整理一遍,当做是理解,侵删。有一个无限的整数数据流,如何从中随机地抽取k个整数出来?这个问题其实还是有点数学的意思在里面的。我们先考虑当k=1的时候,那么如果来一个,咱们就抽这个。如果来俩,那么就有50%的概率,要么

2020-06-26 23:45:22 193

原创 system design之网络爬虫的设计

system design之网络爬虫的设计前言大概的实现思路一些考虑去重并发下载网络瓶颈流水线设计IP封禁前言之前写过简单的爬虫,现在回过头来看看,那简直是不能更low,许多问题我都没有考虑过。大概的实现思路其实实现一个网络爬虫还是很简单的(当然如果你用的是python的话那么会更加简单)。对于算法这一块,主要是使用dfs或者是bfs就能完成操作,然后自己写一下http请求的实现,包括获取网页源码,利用正则表达式解析源码,解析得到想要的网页链接类型等。我目前就是实现了这么一个完整的流程,只能说,打

2020-06-25 22:11:42 142

原创 Raft算法解析-尝试讲解的透彻一点

Raft算法解析-尝试讲解的透彻一点前言Raft简介Raft状态机介绍上伪代码!leader要干点啥日志复制!!一致性检查日志复制的两点保证日志不正常了咋办安全性选举限制提交前面任期的日志条目集群成员的变更日志压缩高效处理只读请求前言Raft算法是我今天无意间看到的东西,就想着了解一下。Raft简介这个东西是用来解决分布式中数据的一致性问题。(我当时看这个东西也是一脸懵逼,但是先别卡在这里,先继续看下去)Raft状态机介绍先放张图吧,画的不是很好。咱们在开始介绍以前呢,先多啰嗦一下需要的背景

2020-06-25 13:26:36 1308

原创 带你学LRU算法-非常简单好用

带你学LRU算法前言正文核心代码实现前言名字听起来挺高大上的,其实内部的原理非常简单,英文全称是Least Recently Used,即最近最少使用算法。正文这算法最初还是源自Linux的内存管理。核心的思想就是,当出现资源不够用的时候,可以把那些使用频率低的资源给释放掉,然后拿来用!这样看起来还是很凶残的,那我举一格例子,是小灰的漫画算法中提到的。用户在访问数据库的时候,程序员会为此做一些缓存记录,以便下一次用户再次访问同样的数据时可以避免磁盘操作,听起来还是很不错的对吧。可是这个缓存咱们不

2020-06-24 19:34:44 205

原创 C++11各种cast的详细介绍-看完就懂

C++11各种cast的详细介绍-看完就懂前言static_castconst_castdynamic_castreinterpret_cast前言这也是我在刷面经的时候看到的,我逐渐摸清楚了大厂面试官的套路:如何衡量一个人对某个知识的了解程度,即问一些犄角旮旯的东西。如果你连这些知识都掌握了,那也就十拿九稳了。static_cast就是一种比较差劲的静态类型转换。为啥叫static静态呢?很简单,因为它没有运行时的动态类型检查。这咋理解呢?没事儿,继续看下去。1.static_cast用在基类与

2020-06-24 18:56:06 749

原创 system design之key-value存储引擎

system design之key-value存储引擎前言题目描述分析sstable主要结构Data blockFilter blockIndexBlockcompaction操作LevelDB主要结构前言最近在准备微软的面试,各位朋友可能有的人不清楚,微软面试是需要考察system design的,基本上是给你一个挺大的设计问题,考察你对这一块的理解程度。这里我基本上是参考了github上一位老哥的总结:soulmachine,侵删。题目描述请设计一个Key-Value存储引擎(Design a

2020-06-24 14:22:50 653

原创 跳表的简单介绍

跳表的简单介绍前言链表是啥如何解决链表痛点实现分析插入操作删除操作查询操作总结一下前言前两天看system design的东西,突然就看到了跳表skip list,然后我就不是很懂了,这次咱们把它搞清楚,确实是非常好理解的东西。链表是啥List大家肯定都很熟悉,但是List的查找操作其实是很僵硬的,对吧?O(n)的复杂度没跑了。如何解决链表痛点这就是为啥咱们要用跳表了。跳表其实在很多数据库的线性结构中都在使用,比如大名鼎鼎的redis(我对redis的了解就很肤浅)。各位试想,如果我能事先把这个

2020-06-23 22:55:34 428

原创 关于进程与线程的同步和线程的那点问题

关于进程与线程的同步和线程的那点问题前言进程同步线程同步volatile线程安全么线程状态转移表与条件如何获取线程状态前言我感觉看了一圈面经后发现,我对进程与线程还存在着认识上的漏洞,这次开个帖子再讲清楚这个东西。进程同步我整理了三种方式,其中临界区我就不写了。进程同步的三种方式是:1.semaphore2.mutex-spinlock3.event线程同步1.临界区2.semaphore3.mutex-spinlock4.eventvolatile线程安全么当然不!线程状态

2020-06-21 01:53:58 152

原创 Linux的IO模型介绍-epoll、poll、select

Linux的IO模型介绍-epoll、poll、select同步与异步IO阻塞与非阻塞IO这俩类根本就不是一回事情Linux的IO模型1.阻塞IO非阻塞IO异步IO多路复用IO(其实这就是同步IO!!!)selectpollepollepoll的两种工作模式:电平触发与边沿触发总结同步与异步IO这个概念其实很简单,A让B去做一件事情,然后B先回复了一声“好的”,再转而去做这件事情,那么这就是异步。如果B先做完了这件事情,然后再回复A“我做好了”,那么这就是同步。所以说,同步还是异步,那是针对被调用者B

2020-06-20 23:16:15 204

原创 调试手段介绍-如果你有更好的欢迎补充

调试手段介绍前言常规查看反汇编代码、内存、寄存器查看栈区条件断点多线程调试gdb调试分享一段调试经历前言这也是我在一些面经中看到的问题,好像出现的频率不是很高,咱们仔细总结一下。常规VS号称宇宙第一编译器,里面的F5 F9 F10 F11就不多说了,不会断点调试的出门右转。另外像查看变量值这些我也不说了,非常简单。查看反汇编代码、内存、寄存器很简单,在程序debug的时候,选择 调试----窗口----反汇编/内存/寄存器就可以查看这些东西了。反汇编都给出了汇编前的代码,可以说非常贴心了。查看

2020-06-20 21:05:30 209

原创 进程之间通信的几种方式,总有一款适合你

进程之间通信的几种方式前言shared memoryPipeMsgMsgQueue前言这个问题面试官必问的好吧,这是非常经典的问题,正好之前的项目中有这样的经历,所以就咱们的项目出发,讲一下进程之间通信的几种方式。shared memory共享内存,大家读写双方约定一块内存地址,然后咱们分别读写这块地址的数据(当然,大家也要一起约定好数据的格式)。记得加锁哦。咱们看一下shared memory的写和读是咋搞的: //1.没有锁的话,创建锁,然后尝试获取锁 HANDLE Gmute

2020-06-20 18:35:01 307

原创 银行家算法-避免死锁的好方法

银行家算法-避免死锁的好方法前言银行家算法大概说一下算法流程引用一下博客园@王陵的一张图具体实例总结前言死锁问题是面试官最喜欢的问题,我在之前的一篇文章里写了死锁的产生条件,这里我写一个死锁的预防算法。银行家算法为什么叫银行家算法呢?其实就是类比银行给客户放贷这件事情。银行家手里的资金是有限的,他决定是否给某个顾客放贷,得看一看自己手上的剩余资源,和顾客的贷款额度。大概说一下算法流程首先呢,银行家算法会创建一些资源列表,包括初始化时最大资源数量列表,目前剩余的资源数量列表。那么进程呢,也有自己

2020-06-20 15:00:00 1242

原创 C++11容器操作原子性分析与atomic

C++11容器操作原子性分析与atomic前言以vector分析跑个题atomic前言这不算前言,这是总结:容器的所有修改操作都不是线程安全的,都不是原子性的操作。以vector分析常规的原子性分析是,A线程改变了vector A[0]这个值,然后B在不知情的情况下去读取A[0],那么自然是会出事情的。以上这一点就决定了容器的所有修改操作其实都是线程不安全的。但是咱们不能忘记一点,当咱们插入vector一些元素的时候,是可能会涉及到扩容操作的。这样一来,很可能其他线程读取任何vector元素都会

2020-06-20 00:32:05 1675

原创 C++ const volatile constexpr static

C++ const volatile与constexpr前言volatile多线程下的volatile前言这是面试官比较喜欢问的问题,咱们把它解决掉,开始。volatile遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。volatile 指出 该变量是随时可能发生变化的,每次使用它的时候必须从 该变量的地址中读取。多线

2020-06-19 01:13:21 252

原创 设计模式入门-六大原则

设计模式入门-六大原则前言开闭原则里式替换原则依赖倒转原则单一职责原则接口分离原则知道最少原则前言毕竟是做了两年的开发,对于设计模式的六大原则算是有点熟悉的,只是没了解的这么全面,这次咱们一次讲清楚这六大原则是啥。开闭原则对扩展开放,对修改关闭。(在不改变原有代码的基础上通过扩展来实现新功能)这条设计原则是六条里最重要的!软件的兼容性其实是很重要的东西,咱们不能轻易的把原先程序的功能做修改,这样子兼容性就很差了。想实现或者修改一个功能时,最好能通过新增模块的方式实现。举个例子,做一个游乐场的售

2020-06-17 17:07:06 110

空空如也

空空如也

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

TA关注的人

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