面试缺陷
文章平均质量分 71
水中鱼_自由
123
展开
-
trie树
根据网易题库,对trie树的理解如下:trie树又称为字典查找树,主要用于统计和查询,可以统计单词前缀的个数。其解决问题的思路主要来源于: http://blog.csdn.net/hackbuteer1/article/details/7964147,十分感谢,并对之进行稍微的修改。使之以C++的方式进行实现。 Trie 的强大之处就在于它的时间复杂度。它的插入和查询时间复杂度都为 O(转载 2016-03-15 22:32:59 · 279 阅读 · 0 评论 -
数组中最长递增子序列
数组是乱序的,如1,-1,2,-3,4,-5,6,-7 根据无后效性定义,数组中当前元素所形成的子序列与其前面元素形成的子序列没有关系,所以: LIS[i+1] = max(1,LIS[k]+1),其中,array[i+1] > arry[k],且任意k<=i LIS[i]存储对于当前数组arry[i]形成的最长子序列的长度值,若arry[i+1]>arry[k],那么第i+1个元素可以接在L原创 2016-08-17 11:06:25 · 358 阅读 · 0 评论 -
最长公共子序列
最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。而最长公共子串(要求连续)和最长公共子序列是不同的。 动态规划的一个计算两个序列的最长公共子序列的方法如下: 以两个序列 X、Y 为例子: 设有二维数组f[i,j] 表示转载 2016-08-02 17:28:39 · 296 阅读 · 0 评论 -
C++排序算法总结
先上来时间复杂度 区分稳定与不稳定:快速、希尔、堆、选择不稳定,其他排序算法均稳定。 C++实现排序算法代码如下:#include<iostream>#include<vector>#include<limits>using namespace std;//插入排序,相当于打牌,相当于把一个值插入到已经排序好的一个数组中,//先把待排序的值放到一个临时变量里面,让排好序的数字从大到原创 2016-07-19 20:52:38 · 1609 阅读 · 0 评论 -
找零钱问题
人民币有1、2、5、10、20、50、100这几种面值。 现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。 比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。 输入有多组,每组一行,为一个整合n。 输入以0结束。 输出该面额有几种表示方法。 使用动态规划解决:#include <iostream>#include转载 2016-08-14 16:50:13 · 658 阅读 · 0 评论 -
字符串截取
代码:#include <iostream>#include<vector>#include<string>#include<algorithm>using namespace std;int main(){ string patter =", ."; string source ="Hello world, i said hello world to the wo原创 2016-08-17 22:19:15 · 240 阅读 · 0 评论 -
单词统计问题
华为OJ 输入一行英文文本,要求输出出现频率最高和最低的单词,中间以,.和空格进行分割,大小不同的单词视为同一个,如果单词数目相同,则输出第一次出现的那个。输出均为小写形式。如”Hello world, i said hello world to the world.”输出world,i 代码如下:#include <iostream>#include<vector>#incl原创 2016-08-18 09:16:25 · 303 阅读 · 0 评论 -
KMP算法
引用一篇非常经典的KMP算法解析,转载一下,记录下来,并稍作修改。谢谢这位大牛: 这里写链接内容 自己理解的代码如下:#include<iostream>#include<string>#include<vector>using namespace std;vector<int> coll;void makeNext(const char P[],i转载 2016-03-16 17:02:05 · 257 阅读 · 0 评论 -
B树和B+树
B树:多路查找树,B树定义如下: 1、每个结点x有以下属性: (a)x.n,当前存储在结点x中的关键字个数为n; (b)x.n个关键字本身x.key1,x.key2…x.keyn,以非降序排列,即x.key1≤x.key2≤…≤x.keyn; (c)x.leaf,bool值,为true表示是叶子节点,false为非叶子节点 2、每个内部节点x含有x.n+1个孩子指针x.c1…x.c转载 2016-08-08 09:40:42 · 251 阅读 · 0 评论 -
字符与数字之间的转换
#include <iostream>#include<vector>#include <string>#include <algorithm>#include<sstream>using namespace std;int StoI(const string &s){ istringstream is(s); int tmp = 0; is >> tmp;原创 2016-09-12 09:48:53 · 637 阅读 · 0 评论 -
火车进站问题
华为OJ【问题描述】 给定一个正整数N代表火车数量,0#include <iostream>#include<string>#include<vector>#include<algorithm>#include <fstream>using namespace std;void PrintNum(vector<int>);void Perm(vector<int> &data,int原创 2016-08-14 11:58:47 · 1389 阅读 · 0 评论 -
TCP协议如何来保证传输的可靠性和数据的顺序性
TCP提供一种面向连接的、可靠的字节流服务。 面向连接:意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。 TCP通过下列方式来提供可靠性和顺序性: 1、应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。原创 2016-08-02 09:16:47 · 12290 阅读 · 2 评论 -
TCP拥塞避免
首先,TCP能提供流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。TCP双方在发送数据时,都会告诉对方自己所能接收的数据窗口大小。这将防止较快主机致使较慢主机的缓冲区溢出。(TCP可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出) TCP连接的每一方都有固定大小的缓冲空间。有发送缓存和接收缓存。 发送缓存存放: 1.发送应用程序传送给发送方TCP**准备发送的数据*原创 2016-08-11 21:50:30 · 571 阅读 · 0 评论 -
分页置换算法
常用的有三种:先进先出算法,最佳置换法,最近最少使用置换法。 先进先出算法:由于认为最早调入内存的页不再被使用的可能性要大于刚调入内存的页,因此,先进先出法总是淘汰在内存中停留时间最长的一页,即先进入内存的页,先被换出。先进先出法把一个进程所有在内存中的页按进入内存的次序排队,淘汰页面总是在队首进行。如果一个页面刚被放入内存,就把它插在队尾。 最佳置换法:最佳置换算法(OPT)在为调入新页面而必原创 2016-03-09 22:24:09 · 1607 阅读 · 0 评论 -
剑指offer相关代码
全是纯手工编写,方便自己查看#include<iostream>#include<vector>#include<stack>#include<queue>using namespace std;//使用递归时,函数进去的第一步就是判断退出递归的边界条件,因为递归都是要返回值的,所以第二步就是定义返回值的变量,此变量的初始值与第一步边界条件返回值要相反或不同//(因为只返回一个值,一般只原创 2016-08-14 09:50:42 · 307 阅读 · 0 评论 -
operator =注意事项
重载操作符,遵循的规则是 A& operator =(const A& rhs);在重载=时,1、要考虑证同情况即自我赋值,即A a; a=a; 2、考虑异常安全的情况,避免内存分配失败,例如:A& operator =(const A& rhs){ if(this == &rhs) return this;//证同 delete pb;//pb是A中的一个成员变量BitMap原创 2016-04-16 16:09:22 · 476 阅读 · 0 评论 -
寻找最近点对
具体分析见编程之美解法三,代码如下:#include <stdio.h> #include <algorithm> #include <vector> #include <math.h> class Point { public: Point(int x, int y) : x_(x), y_(y) {} Point() : x_(0), y_(0) {}转载 2016-08-16 11:23:37 · 304 阅读 · 0 评论 -
给定一个十进制n,从1开始,到n的所有整数,求出现1的个数
使用数学归纳法,代码如下:/统计出现1的个数,使用数学归纳法,得出的规律如下://分别计算每一位可能出现的1的次数,然后把每一位的次数相加//思想:1、若当前位为0,则出现的次数仅由其更高位的数字决定,值为:更高位数字*当前位所在的位数//2、若当前位为1,则出现的次数有更高位和其低位决定,值为:更高位数字*当前位所在的位数+更低位数字+1;//3、若当前位>1,则出现的次数由更高位决定,值原创 2016-08-15 22:19:03 · 1878 阅读 · 0 评论 -
如何解决内存碎片
内存碎片的产生: 内存分配有静态分配和动态分配两种 静态分配在程序编译链接时分配的大小和使用寿命就已经确定,而应用上要求操作系统可以提供给进程运行时申请和释放任意大小内存的功能,这就是内存的动态分配。 因此动态分配将不可避免会产生内存碎片的问题,那么什么是内存碎片?内存碎片即“碎片的内存”描述一个系统中所有不可用的空闲内存,这些碎片之所以不能被使用转载 2016-03-29 22:20:20 · 1656 阅读 · 0 评论 -
C++ 多态
多态性:即把具有继承关系的多个类型(不同派生类)称为多态类型,因为我们能使用这些类型的”多种形式”而无需在意他们的差异。指针和引用的静态类型和动态类型不同是C++支持多态性的本质。 当我们使用基类的指针或引用调用基类中定义的一个函数时,我们并不知道该函数真正作用的对象是什么类型,因为他可能是一个基类的对象,也可能是一个派生类的对象。如果该函数是虚函数,则直到运行时才会决定到底执行哪个版原创 2016-03-31 21:52:48 · 222 阅读 · 0 评论 -
为什么银行有取号机而超市结账的时候没有
个人理解如下: 银行有取号机的原因:柜台的人员相当于共享资源,而每一个客户相当于一个进程,取号的原因是共享资源一次只能使一个进程占用,由于每个进程占用的时间不同,这样就设置了一个优先级,所以当排队进程看到共享资源被占用,则该进程可以去处理其他业务,当共享资源被释放,唤醒优先级较高的进程,使之占用该共享资源,这样就能够有效得利用CPU。 超市结账时没有:此处每个客户占用的时间都差不多,所以并不需要原创 2016-03-13 10:35:06 · 1233 阅读 · 0 评论 -
大端字节序和小端字节序
端模式分为:小端字节序和大端字节序,也就是字节在内存中的顺序。小端字节序:低字节存于内存低地址;高字节存于内存高地址。如一个long型数据0x12345678 0x0029f458 0x78 0x0029f459 0x56 0x0029f45a 0x34 0x0029f45b 0x12 在以上数据存放于内存中的表现形式中,0x00转载 2016-04-08 10:00:20 · 291 阅读 · 0 评论 -
SGI 内存池
内存池:是解决内存碎片的主要方法,由于new和malloc是直接从操作系统那里通过其算法申请内存,每次申请操作系统都要执行一次,所以申请效率不仅不高,而且频繁的申请与释放内存会形成大量的内存碎片。而内存池的主要思想就是在初始化时就分配一大块内存给程序,当需要内存时,就从这一大块中切给程序,当释放时,也是释放到内存池中,并没有释放给操作系统。这样会大大的减少内存碎片,因为所有的内存操作都只在这个内存池原创 2016-04-09 11:00:25 · 621 阅读 · 0 评论 -
char,short,int,long等数据类型
char:占一个字节,8位 short:占两个字节,16位 int:一般占一个机器字节,对于16位操作系统,则占16位,即2个字节,32位操作系统则占32位,即4个字节,64位操作系统为了向下兼容,也是32位。 long:只是规定了最小和int型一样大一般占1个或2个机器字节原创 2016-03-27 20:48:06 · 658 阅读 · 0 评论 -
vector 和list
面试:为什么在字符串编程时用vector而不用list? vector和list的区别: vector适用:对象数量变化少,简单对象,随机访问元素频繁,它维护的是一个线性连续控件,所以普通指针就可以作为vector的迭代器。迭代器类型是随机迭代器 Random Acess Itrator.迭代器是普通指针。所以对于要随机存取的数据中的子数据来说,vector比list好用。 list适用:对象原创 2016-03-27 21:02:41 · 293 阅读 · 0 评论 -
迭代器类型
除了原生指针如int*等之外,迭代器总共有5种: Input Iterator:只读迭代器:这种迭代器所指的对象不允许外界改变,支持operator++; Output Iterator:只写迭代器:只能写,支持operator++; Forward Iterator:允许在其所形成的区间内进行读写操作,支持operator++; Bidirectional Iterator:双向迭代器:支原创 2016-03-27 21:12:09 · 388 阅读 · 0 评论 -
观察者模式
在设计模式中,首先有一个开放-封闭原则:开放是指可以被扩展,封闭是指原有的代码不能被修改。 观察者模式定义为:观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听某一对象,当该对象在状态发生变化时,会通知所有的观察者,是它们能够自动更新自己。 注意,观察者类与监听的对象的类不能有耦合,可以利用抽象类和接口来实现解耦合。将观察者类和监听的对象类都分别抽象为两个抽象类,在监听抽象类中的某个动作原创 2016-03-08 20:57:40 · 400 阅读 · 0 评论 -
n&(n-1)
n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,先看一个简单的例子: n = 10100(二进制),则(n-1) = 10011 ==》n&(n-1) = 10000 可以看到原本最低位为1的那位变为0。 弄明白了n&(n-1)的作用,那它有哪些应用? 1. 求某一个数的二进制表示中1的个数 while (n >0 ) { count ++; n &转载 2016-03-28 22:12:23 · 304 阅读 · 0 评论 -
何时使用递归解决问题?-重建二叉树
将主问题分割成小问题的时,当发现小问题与主问题在本质上是一样的,即小问题重复主问题分割成小问题这个步骤时,分割成更小的问题,就要用递归方法解决。典型的应用:根据二叉树的前序遍历和中序遍历,创建一个二叉树结构问题。 思路如下:第一:根据前序遍历的第一个结点值为根结点,然后遍历中序遍历的输出,找到这个根节点在中序遍历中的位置,记录此位置pos,此时,在中序遍历左边的全部是根节点中左子树上面的结点,右边原创 2016-04-15 16:51:59 · 709 阅读 · 0 评论 -
C++线程池
一般用于服务器,防止建立过多的线程导致系统响应慢等。线程池主要由以下几个部分组成: 任务接口:用于具体任务重载,使线程池中的线程获取其任务; 工作线程:用于创造一个线程,并用线程从任务列表中获取任务并执行; 线程管理器:用于管理线程类创建的线程。即线程池管理器,此类内包括了工作线程类,任务列表,线程列表(即线程池)。利用线程管理器,实现开启工作线程,管理线程池(负责对线程池里面的线程进行添加或转载 2016-04-23 20:57:14 · 319 阅读 · 0 评论 -
关系表与非关系表的区别
实体(记录),意为对于用户来说非常重要、需要在数据库中表示的内容,关系表:数据以关系(relation)的形式来存储,具有以下特征: 1、表的每行存储了某个实体或实体某个部分的数据。 2、表的每列包含了用于表示实体某个属性的数据。 3、表中的每个单元格都必须包含一个值,单元格中不允许有重复的元素。(若有多个值,则为非关系表) 4、任 意 一 列中所有条目的类型必须一致。 5、每列都必须有唯原创 2016-06-01 15:49:18 · 3500 阅读 · 0 评论 -
线程死锁问题
有如下两个问题: 第一:线程死锁后CPU和内存的状况如何? 答:内存使用量不变,因为死锁后双方线程除了占用到自己的资源以外,并没有申请到其他内存资源。CPU应该分为两种情况:第一,在申请不到资源时一直处于等待,则会占用CPU的资源,导致CPU使用增加。第二:如果申请不到CPU资源时,就进入休眠状态,退出等待队列,就不会占用CPU资源。 第二:发生死锁以后,如何快速定位死锁线程,原创 2016-03-08 17:31:11 · 1010 阅读 · 0 评论