
面试题
文章平均质量分 58
线上幽灵
大道至简
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
斐波那契数列
斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项,初始状态f(1) = 1, f(2) = 1, 函数的状态转移问题:f(n) = f(n-1) + f(n-2)。转载 2024-02-04 17:41:13 · 160 阅读 · 0 评论 -
在100G文件中找出出现次数最多的100个IP
这个分类很关键,如果是随便分成100份,相同的IP被分在了不同的文件中,接下来再对每个文件统计次数并做归并,这个思路就没有意义了,起不到“大而化小,各个击破,缩小规模,逐个解决”的效果了。在统计完100个文件之后,我再建立一个小顶堆,大小为100,把建立好并存在硬盘哈希表载入内存,逐个对出现次数排序,挑出出现次数最多的100个,由于次数直接和IP是对应的,找出最多的次数也就找出了相应的IP。每条IP最长为15个字节,则100G/15=6.7G条,IP一共有多少种呢,不考虑IPv6,约有256。转载 2022-09-18 08:51:43 · 1509 阅读 · 0 评论 -
什么是mmap?
由于CPU和IO速度的差异问题,产生了DMA技术,通过DMA搬运来减少CPU的等待时间。传统的IO。转载 2022-09-14 22:48:32 · 559 阅读 · 0 评论 -
单例模式
单例模式一般分为:饿汉模式、懒汉模式、DCL模式、holder模式和枚举模式一、饿汉模式public class HungerySingleton { private static HungerySingleton instance = new HungerySingleton(); private HungerySingleton() {} public static HungerySingleton getInstance() { return instan原创 2020-10-04 21:31:22 · 193 阅读 · 0 评论 -
O(N)的时间寻找最大的K个数
O(N)的时间寻找最大的K个数public class Test { public static int partition(int[] array, int left, int right) { int cur = array[left]; while (left < right) { while (right > -1 && array[right] <= cur) --right;原创 2020-10-04 21:29:57 · 259 阅读 · 0 评论 -
互斥锁和读写锁的区别
相交进程之间的关系主要有两种,同步与互斥。所谓互斥,是指散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。所谓同步,是指散布在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。 显然,同步是一种更为复杂的互斥,而互...转载 2018-08-19 08:59:45 · 10114 阅读 · 0 评论 -
实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit()).md
关于vector已经写的差不多了,似乎要接近尾声了,从初始化到如何添加元素再到copy元素都有所涉及,是时候谈一谈内存的释放了。是的,对于数据量很小的vector,完全没必要自己进行主动的释放,因为那样对程序的效率几乎没有影响。但是当vector中存入大量的数据后,并且都数据进行了一些操作,比如删除后,如果我们能积极主动的去释放内存,那么是非常明智的。写到这里,应该明确了size和capaci...转载 2018-09-18 21:57:45 · 4745 阅读 · 0 评论 -
常见HTTP状态码含义
对网站管理工作者来说有个词不陌生,HTTP状态码,它是用以表示网页服务器HTTP响应状态的3位数字代码。状态码的第一个数字代表了响应的五种状态之一。1XX系列:指定客户端应相应的某些动作,代表请求已被接受,需要继续处理。由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应。2XX系列:代表请求已成功被服务器接收、理解、并...转载 2018-10-17 22:43:20 · 1592 阅读 · 0 评论 -
进程与线程的区别与联系、进程与线程的通信方式
一、为什么引入进程?进程是为了提高CPU的执行效率,减少因为程序等待带来的CPU空转以及其他计算机软硬件资源的浪费而提出来的。二、为什么引入线程?为了减少进程切换和创建的开销,提高执行效率和节省资源 。三、线程和进程的区别?调度:线程是独立调度的基本单位,进程是拥有资源的基本单位。在同一进程中,线程的切换不会引起进程的切换;在不同的进程中,进行线程切换,则会引起进程的切换。拥有资源:...原创 2018-10-08 14:44:16 · 3996 阅读 · 0 评论 -
C++与C的区别
C是一个结构化语言,它的重点在于算法和数据结构。对于语言本身而言,C是C++的子集。C程序的设计首要考虑的是如何通过一个过程,对输入进行运算处理,得到输出。对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够配合对应的问题,这样就可以通过获取对象的状态信息得到输出或实现过程控制。因此,C与C++的最大区别在于,它们用于解决问题的思想方法不一样。C实现了C++中过程化控制及其他相关功能。...原创 2018-10-08 15:02:00 · 2807 阅读 · 0 评论 -
产生死锁的必要条件及处理方法
一、计算机系统中的死锁竞争不可抢占性资源引起死锁竞争可消耗资源引起死锁进程推进顺序不当引起死锁二、产生死锁的必要条件互斥条件(资源独占)请求和保持条件不可抢占条件(不可剥夺)循环等待条件三、处理死锁的方法预防死锁避免死锁检测死锁解除死锁四、预防死锁破坏‘请求和保持’条件破坏‘不可抢占条件’条件破坏‘循环等待’条件(主要是破坏产生死锁的后三个条件)...原创 2018-10-08 15:08:37 · 1714 阅读 · 0 评论 -
TCP和UDP的区别
TCP和UDP的区别:传输控制协议TCP的特点:(1) TCP是面向连接的运输层协议(2) 每一条TCP连接只能有两个端口,即:点对点(3) TCP提供可靠交付的服务(4) TCP提供全双工通信(5) 面向字节流,TCP中的“流”指流入到进程或从进程流出的字节序列用户数据报协议UDP的特点:(1) UDP是无连接的(2) UDP使用尽最大努力交付(3) UDP是面向报文(4)...原创 2018-10-08 15:12:27 · 1179 阅读 · 0 评论 -
C++ const修饰函数、函数参数、函数返回值
const修饰函数在类中将成员函数修饰为const表明在该函数体内,不能修改对象的数据成员而且不能调用非const函数。为什么不能调用非const函数?因为非const函数可能修改数据成员,const成员函数是不能修改数据成员的,所以在const成员函数内只能调用const函数。#include <iostream> using namespace std; cl...转载 2018-09-08 21:53:50 · 350 阅读 · 0 评论 -
结构体变量之间的比较和赋值原理
结构体变量之间可以直接赋值我想大家都知道了。但结构体变量之间可以做比较吗?答案肯定是不行的,因为比较符号只作用于基本数据类型。如果是用C++或者Java来编程时遇到结构体变量之间的比较,那还好办直接对操作符重载就可以了。但如果是用C语言来编程遇到它呢?很多人说那可以自己写个函数啊,自己想怎么实现就怎么实现,况且写个结构体变量之间的比较程序又不是什么难事。但我想问的是你遇到的结构体里面的成员才多少个...转载 2018-09-08 09:27:25 · 16381 阅读 · 1 评论 -
排序之外部排序
有时,待排序的文件很大,计算机内存不能容纳整个文件,这时候对文件就不能使用内部排序了(这里做一下说明,其实所有的排序都是在内存中做的,这里说的内部排序是指待排序的内容在内存中就可以完成,而外部排序是指待排序的内容不能在内存中一下子完成,它需要做内外存的内容交换),外部排序常采用的排序方法也是归并排序,这种归并方法由两个不同的阶段组成: 采用适当的内部排序方法对输入文件的每个片段进行排序,将排...转载 2018-08-21 19:11:59 · 274 阅读 · 0 评论 -
为什么要划分用户态和系统态?
用户态:用户执行状态简称用户态。系统态:系统执行状态简称系统态或核心态。进程的用户程序段在执行时,该进程处于用户态。而一个进程的系统程序段在执行时,该进程处于系统态。为什么要划分用户态和系统态?一个最主要原因是要把用户程序和系统程序区分开,以利于程序的共享和保护。显然,这也是以增加系统复杂度和系统开销为代价的。——来自张尧学著《计算机操作系统教程》...原创 2018-08-20 11:19:34 · 6838 阅读 · 0 评论 -
进程间同步的几种方法
什么是临界区? 每个进程中访问临界资源的那段程序称为临界区(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。 进程间同步 把异步环境下的一组并发进程因直接制约而互相发送消息而进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。实现进程间同步主要有如下方法:信号量用P、V原语生产者-消...原创 2018-08-17 09:23:17 · 21881 阅读 · 0 评论 -
为什么多线程读写 shared_ptr 要加锁
我在《Linux 多线程服务端编程:使用 muduo C++ 网络库》第 1.9 节“再论 shared_ptr 的线程安全”中写道:(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shar...转载 2018-08-22 16:14:31 · 700 阅读 · 0 评论 -
水库抽样算法
随机抽样问题表示如下:要求从N个元素中随机的抽取k个元素,其中N无法确定。这种应用的场景一般是数据流的情况下,由于数据只能被读取一次,而且数据量很大,并不能全部保存,因此数据量N是无法在抽样开始时确定的;但又要保持随机性,于是有了这个问题。所以搜索网站有时候会问这样的问题。这里的核心问题就是“随机”,怎么才能是随机的抽取元素呢?我们设想,买彩票的时候,由于所有彩票的中奖概率都是一样的,...转载 2018-08-19 19:55:21 · 1818 阅读 · 0 评论 -
C++智能指针 weak_ptr
weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象. 进行该对象的内存管理的是那个强引用的 shared_ptr. weak_ptr只是提供了对管理对象的一个访问手段. weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_...转载 2018-08-16 23:39:44 · 312 阅读 · 0 评论 -
确保线程安全的几种方法
对于基于Linux操作系统的开发者来说,多线程是一个在开发和面试中不可避免的、被广泛讨论的话题。最近,我被问到了一个和多线程有关的问题:如何确保线程安全?在刚听到这个问题的时候,我还一时回答不上来。后面,我查找了与线程安全相关的资料,算是补上了问题的答案。本文首先对线程进行简单的介绍,然后介绍几种保证线程安全的方法。线程简介 在介绍线程之前,要引入进程(Process)的概念。进程有狭义和...转载 2018-08-16 23:24:43 · 1658 阅读 · 0 评论 -
服务器基础:聊聊Linux中的5种I/O模型
1 概念说明在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 IO 1.1 用户空间与内核空间现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有...转载 2018-08-16 22:25:12 · 1227 阅读 · 0 评论 -
TCP状态中 time_wait 的作用
TCP状态中 time_wait 的作用:客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间。这么做有两个理由:确保最后一个确认报文段能够到达。如果 B 没收到 A 发送来的确认报文段,那么就会重新发送连接释放请求报文段,A 等待一段时间就是为了处理这种情况的发生。可能存在“已失效的连接请求报文段”,为了防止这种报文...原创 2018-10-08 15:15:46 · 1727 阅读 · 0 评论 -
TCP的三次握手和四次挥手过程
三次握手的过程:四次挥手的过程:原创 2018-10-08 15:24:01 · 863 阅读 · 0 评论 -
C++中map、hash_map、unordered_map、unordered_set的区别
标题中提到的四种容器,对于概念不清的人来说,经常容易弄混淆。这里我不去把库里面复杂的原码拿出剖析,这个如果有兴趣其实完全可以查C++Reference,网上的原码是最权威和细致的了,而且我觉得有耐心直接认真看原码的人,也不需要我这篇速记博文了,所以我这里还是讲的通俗一些,把它们区分的七七八八。一、hash_map与unordered_map这两个的内部结构都是采用哈希表来实现。区别在哪里?un...转载 2018-10-17 11:02:41 · 4655 阅读 · 0 评论 -
C/C++中extern的用法
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a.c中声明ex...转载 2018-10-17 10:13:44 · 8701 阅读 · 0 评论 -
_exit和exit的区别
在linux的标准库函数中,有一套称作高级I/O的函数,我们熟知的printf 、fopen 、fread 、fwrite都在此列,他们也被称作缓冲I/O。其特征是对应每一个打开的文件,都存在一个缓冲区, 在内存中都有一片缓冲区,每次读文件会多读若干条记录,这样下次读文件时就可以直接从内存的缓存中取出,每次写文件时也仅仅是写入到内存的缓冲区,等待满足一定的条...转载 2018-10-17 09:47:16 · 3712 阅读 · 6 评论 -
C++面试题总结
1:进程与线程的区别?答案:https://blog.youkuaiyun.com/chen134225/article/details/829677182:进程间的通信方式?答案:https://blog.youkuaiyun.com/chen134225/article/details/829677183:线程间的通信方式?答案:https://blog.youkuaiyun.com/chen134225/articl...原创 2018-10-09 10:23:19 · 343 阅读 · 0 评论 -
malloc的原理
malloc的原理步骤分为放置、分割和合并在堆中,堆块由一个字的头部、有效载荷、填充以及一个字的脚部组成,空闲块是通过头部中的大小字段隐含地连接在一起形成一个隐式空闲链表,分配器可以通过遍历堆中所有的块,从而间接遍历整个空闲块的集合。放置已分配的块当一个应用请求一个k字节的块时,分配器搜索空闲链表,查找一个足够大可以放置所请求块的空闲块,分配器执行这种搜索的方式是放置策略确定的。常见的...原创 2018-10-09 10:16:40 · 1321 阅读 · 0 评论 -
插入、希尔、冒泡、快速、选择、堆、归并排序算法和性质
插入、希尔、冒泡、快速、选择、堆、归并排序算法和性质。原创 2018-10-09 10:08:30 · 981 阅读 · 0 评论 -
有了malloc、free,为什么还要new、delete?
有了malloc/free,为什么还要new/delete?malloc与free是C/C++的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象的消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权...原创 2018-10-09 09:43:43 · 1389 阅读 · 0 评论 -
虚函数和纯虚函数的区别
虚函数和纯虚函数的区别?虚函数引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。纯虚函数在基类中是没有定义的,必须在子类中加以实现。纯虚函数引入原因:在很多情况下,基类本身生成对象是不合情理的。纯虚函数就是基类只定义了函数体,没有实现过程,定义方法如下;virtual void Eat() = 0; 直接=0 不要 在cpp中定义就可以了。纯虚函数相当于接口,不能直接...原创 2018-10-09 09:14:57 · 4259 阅读 · 0 评论 -
vector删除数据的注意事项
vector删除数据的注意事项?先用迭代器指向vector的起始位置,然后用while循环,找到符合的元素,删除迭代器所指向的元素,返回一个指向被删元素之后元素的迭代器,这时不能在自增了,因为迭代器指针已经指向下一个元素了,如果在自增,就将被删除的元素的后面一个元素就跳过去了,如果在被删除的元素在末尾,那么迭代器指针就会变成野指针。...原创 2018-10-09 09:10:58 · 2091 阅读 · 0 评论 -
memcpy和strcpy的区别
memcpy和strcpy的区别?strcpy和memcpy主要有以下3方面的区别。复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,如果空间不够,就会引起内存溢出。memcpy则是根据其第3个参数决定复制的长度。用途不同。通常在复制字符串时用...原创 2018-10-09 09:06:36 · 7928 阅读 · 0 评论 -
浅拷贝和深拷贝的区别
浅拷贝和深拷贝的区别:浅拷贝对一个已知对象进行拷贝,编译系统会自动调用一种构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数,调用一次构造函数,调用两次析构函数,两个对象的指针成员所指内存相同,但是程序结束时该内存却被释放了两次,会造成内存泄漏问题。深拷贝在对含有指针成员的对象进行拷贝时,必须要自己定义拷贝构造函数,使拷贝后的对象指针成员有自己的内存空间,即进行...原创 2018-10-09 08:57:31 · 2019 阅读 · 1 评论 -
多态的实现
多态的实现:(1)编译时的多态性。编译时的多态性是通过重载来实现的。对于非虚的成员来说。系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。(2)运行时的多态性。运行时的多态性就是直到系统运行时,才根据实际情况决定实现何种操作。C++中,运行时的多态性通过虚函数实现。...原创 2018-10-09 08:54:05 · 2362 阅读 · 0 评论 -
哈希表处理冲突的方法
一、基本概念哈希表,也叫散列表,是根据关键字而直接进行访问的数据结构。也就是说,它将关键字通过某种规则映射到数组中某个位置,以加快查找的速度。这个映射规则称为哈希函数(散列函数),存放记录的数组称为哈希表。哈希表建立了关键字和存储地址之间的一种直接映射关系。二、处理冲突的方法(1) 链地址法链地址法是指把所有的冲突关键字存储在一个线性链表中,这个链表由其散列地址唯一标识。(2) 开放定址...原创 2018-10-08 16:20:59 · 4425 阅读 · 0 评论 -
static和const关键字的作用
static和const关键字的作用?static关键字的作用:(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内...原创 2018-10-08 16:13:48 · 1191 阅读 · 0 评论 -
STL中vector的实现原理
STL中vector的实现原理vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,ve...原创 2018-10-09 09:01:14 · 2257 阅读 · 0 评论 -
事务具有四个特性
事务具有四个特性(ACID):原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持续性(Durability)原创 2018-10-08 15:27:25 · 1517 阅读 · 0 评论