
数据结构与算法
文章平均质量分 63
数据结构与算法
handsomeKyne
清华大学硕士,蚂蚁金服算法工程师一枚
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
每日一题:1047. 删除字符串中的所有相邻重复项
每日一题:1047. 删除字符串中的所有相邻重复项1、题目给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:"abbaca"输出:"ca"解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操原创 2021-03-09 23:09:41 · 396 阅读 · 0 评论 -
每日一题:单调栈系列
每日一题:单调栈系列1、题目一:496. 下一个更大元素I给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。示例 1:输入: nums1 = [4,1,2], nums2 = [1,3,4,2].输出: [-1,3,-1]解释:原创 2021-03-06 19:12:14 · 334 阅读 · 0 评论 -
招商银行面试心得
本人小硕一枚,水平有限,望大神轻喷,若有不足之处,请毫不留情的指出。^_^慢慢地开始习惯用博客开始记录学习和生活的点点滴滴。今天是2016-6-30,参加了深圳总行的系统管理员面试,具体面试内容这里不详细讨论。主要想表达一下几点:1、面试官都很nice,三个领导以及北京方面有一个面试官用视频面试,到最后我才知道,镜头那边竟然还有一个面试官。是不是感觉有一种被窥视的感觉,其实感觉还好原创 2016-06-30 21:53:46 · 8795 阅读 · 0 评论 -
程序员面试(c++)——指针与引用
本文是对《程序员面试宝典》第七章——指针与引用的学习总结,不足之处,欢迎批评指正。1、指针和引用的区别?(1)指针可以指向空值,int* p=null;而引用则必须总是指向某个对象。(2)指针在使用之前应该总要被测试是否合法,而引用则不需要。(3)引用一旦指向某个对象,则不可以在指向其他对象,然而它指向对象的值是可以被修改的。(4)由于以上不同决定了,指针和引用的应用是不同的。原创 2016-06-29 20:55:18 · 1002 阅读 · 1 评论 -
二维数组指针
概括的说,指针其实就是可变数组的首地址,说是可变数组,是 指其包含内容的数量的可变的,并且是可动态申请和释放的,从而充 分节约宝贵的内存资源。我一向喜欢一维数组,除非万不得已,我一 般是不用二维数组的,多维的则更是很少涉足了。因为一维简单,容 易理解,而用指针指向的多维数组就具有相当的复杂性了,也因此更 具有讨论的必要。 闲话少说,这里我就以三个二维数组的比较来展开转载 2016-06-18 16:52:39 · 241 阅读 · 0 评论 -
操作系统面试—虚拟内存
本文是对操作系统概念(第七版)——虚拟内存的学习总结,不足之处,欢迎批评指正。1、虚拟内存的理解:先将部分程序导入内存,执行完成后导入下一部分程序,给我们的感觉是内存变大了,实际上物理内存的大小并未发生变化。虚拟内存的优点:(1)将逻辑内存和物理内存分开。(2)虚拟内存允许文件和内存通过共享页而为两个或多个进程所共享。2、按需调页按需调页:顾名思义,在需原创 2016-06-24 18:12:22 · 7987 阅读 · 1 评论 -
操作系统面试—内存管理
本文是对操作系统概念(第七版)——内存管理的学习总结,不足之处欢迎批评指正。首先我们区分什么是逻辑地址空间和物理地址空间。逻辑地址空间:cpu所生成的地址,逻辑地址又称为虚拟地址。物理地址:内存单元所看到的地址(加载到内存寄存器中的地址)。运行是从虚拟地址到物理地址的映射是由内存管理单元(MMU)的硬件设备来完成的。现在有两个不同的地址,逻辑地址0~max,物理地址R~R+ma原创 2016-06-24 16:55:18 · 2439 阅读 · 0 评论 -
操作系统面试—死锁(三)——死锁检测和死锁恢复
本文是对操作系统概念(第七版)——死锁的学习总结,不足之处,欢迎批评指正。本文讨论的两块内容是死锁检测和死锁恢复。1、死锁检测首先针对每种资源类型只有一个实例的情况。该算法使用资源分配图的一个变种,称为等待图。从资源分配图中,删除所有资源类型的节点,合并合适边,就可以得到等待图。合并的过程如下:如果pi指向资源rj,而rj右指向pk,那么删除节点rj之后,直接得到pi->pk这原创 2016-06-24 15:27:09 · 9778 阅读 · 0 评论 -
操作系统面试—死锁(二)——银行家算法
本文是对操作系统概念(第七版)第七章——死锁的学习总结,不足之处欢迎批评指正。上文中我们提到了资源分配图算法,只适合每种资源只有一个实例的情况。当每种资源不止一个实例时,资源分配图算法将不再适合,因此需要用到我们这一章要讲的银行家算法。银行家算法的命名是它可以用了银行系统,当不能满足所有客户的需求时,银行绝不会分配其资金。当新进程进入系统时,它必须说明其可能需要的每种类型资源实例的最大原创 2016-06-24 15:11:05 · 4461 阅读 · 0 评论 -
操作系统面试—死锁
本文是对操作系统概念(第七版)第七章——死锁的学习总结,不足之处,欢迎各位批评指出。1、死锁的必要条件(重要)互斥——至少有一个资源必须处于非共享状态,即一次只能有一个进程使用。占有并等待——一个进程必须占有至少一个资源,并等待另一资源,而该资源为其他进程占有。非抢占——资源不能被抢占。循环等待——有一组等待进程{p0,p1,p2,...pn},p0等待的资源为p1所有,p1的原创 2016-06-24 11:51:30 · 1789 阅读 · 0 评论 -
操作系统面试—进程同步(二)
本博文是对上一篇博文的继续,不足之处欢迎大家批评指正。一、首先介绍常见的经典同步问题1、有限缓冲问题假定有n个缓冲项,信号量mutex提供对缓冲池访问的互斥要求,并初始化为1。信号量empty和full代表空缓冲项和满缓冲项的个数,信号量empty初始化为n,full初始化为0。生产者的代码如下:do{...//生产出一项...wait(empty);wai原创 2016-06-24 10:34:11 · 672 阅读 · 0 评论 -
操作系统面试—进程同步
本文是基于操作系统概念(第七版)第六章的学习总结,不足之处欢迎批评指正。一、什么是临界区问题?临界区是指在该区域中,进程可能改变共同变量、更新一个表、写一个文件等。如果多个进程进入临界区进行修改,那么将会引起混乱。典型进程的通用结构:do{进入区; 临界区;退出区; 剩余区;}while(true);临界区问题的解答必须满足下面三个要求:1、互斥。原创 2016-06-23 21:49:42 · 1142 阅读 · 0 评论 -
操作系统面试—cpu调度
cpu调度是多道程序设计的基础。本文是对操作系统概念(第七版)第五章——cpu调度的学习总结,不足之处欢迎各位博友提出,共同进步。本文内容:1、介绍cpu调度常见概念。2、介绍cpu调度算法以及特点。(1)cpu调度决策发生的情况:a、当一个进程从运行态到等待状态。(I/O请求)b、运行状态到就绪态(中断)c、等待状态到运行态d、一个进程终止其中a,d是原创 2016-06-21 11:08:12 · 1556 阅读 · 1 评论 -
深拷贝和浅拷贝
这两天被深拷贝和浅拷贝弄得头晕晕的,决定认真看一下这其中的奥秘。总结如下,各位大神轻喷。1、什么情况下会调用拷贝构造函数?(1)一个对象以值传递的方式传入函数体。(2)一个对象以值传递的方式从函数返回。(3)一个对象需要通过另一个对象进行初始化。即当用一个已初始化的自定义类型对象去初始化另一个新构造的对象时,拷贝构造函数被调用。2、什么是前拷贝和深拷贝?浅拷贝即位拷贝,也就原创 2016-06-17 16:26:39 · 468 阅读 · 0 评论 -
C/C++ 中的0长数组(柔性数组)
本文转载自点击打开链接在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻辑上看,是完全没有意义的。但是,GUN中却允许使用,而且,很多时候,应用在了变长结构体中,如:StructPacket{Int state;Int len;Char cData[0]; //这里的0长结构体就为变长结构体提供了非常好的支持转载 2016-06-17 11:55:57 · 301 阅读 · 0 评论 -
结构体和联合体在内存分布中的总结
结构体内存分布三大原则:原则1:数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储,double为8字节,那么存放的位置从8的位数开始)。原则2:结构体作为成员:如果一个结构里有其他结构体成员,则结构体成员要从原创 2016-06-17 11:32:03 · 2903 阅读 · 0 评论 -
程序员面试(c++)——预处理,const与sizeof总结
本文是对《程序员面试宝典》的学习总结,不足之处望多多批评指正。每次看《程序员面试宝典》都有收获,但是不总结,有些东西原创 2016-06-29 14:42:29 · 508 阅读 · 0 评论 -
cracking the code interview——c++实现
本系列是我对cracking the code interviews的c++实现和学习,不足之处欢迎批评指正。题目:实现一个算法,判断其中的字符是否都不相同。如果不能用数据结构,又该如何实现?解:首先得向面试官问清楚是Unicode还是ASCII编码,这里我们假设为ASCII编码。具体代码实现如下:#include#includeusing namespace std;原创 2016-07-09 09:03:53 · 887 阅读 · 0 评论 -
c风格的字符串
今天要实现一个自己的反转函数,反转char*字符串,发现对char写入时一直提示访问出错。重新学了一下c风格的字符串,总结一下c风格的字符串,以及出现这个问题的原因。重要:1、字符串字面值的类型是const char类型的数组,因此是不可以直接改变的。2、字符串字面值是以null为结束的字符数组。3、永远不要忘记char*是以null为结束的,因此分配内存大小时要多加1.因此这原创 2016-07-09 09:56:47 · 312 阅读 · 0 评论 -
STL序列式容器之vector
首先我们需要对STL的容器有一个宏观的概念,然后在仔细讨论vector。STL容器分为两类:分别是序列式容器和关联式容器。序列式容器:vector, heap, priority_queue, list, slist, deque, stack, queue.需要说明的是,heap内含一个vector,priority_queue内含一个heap,stack内含一个deque,qu原创 2016-07-10 23:14:38 · 493 阅读 · 0 评论 -
STL空间配置器
本文是对STL源码解析第二章的学习总结,不足之处,欢迎批评指出。1、SGI标准的空间配置器,std::allocator虽然SGI也定义了一个部分标准的,名为allocator的配置器,但SGI自己从未使用过,主要原因是效率不佳。它只是将c++的operator new和operator delete做一层薄薄的封装而已。注意operator new只负责内存分配,而new还要复制构造。实原创 2016-07-10 21:42:20 · 306 阅读 · 0 评论 -
STL源码解析——traits(特性)编程技巧
侯捷老师在《STL源码剖析》中说到:了解traits编程技术,就像获得“芝麻开门”的口诀一样,从此得以一窥STL源码的奥秘。如此一说,其重要性就不言而喻了。 之前已经介绍过迭代器,知道了不同的数据结构都有自己专属的迭代器,不同的迭代器也有不同的特性,由于算法的接口是统一的,通过迭代器的不同属性,算法自动选择正确的执行流程,在完全任务的同时,也尽可能提高算法的执行效率。那算法如何获知转载 2016-07-10 21:59:49 · 524 阅读 · 0 评论 -
STL序列式容器之双端队列——deque
前面我们学习过序列容器vector,vector是占用一段连续内存空间,并且是单向开口的,只能在尾部进行压入或者弹出元素(其实从技术上讲,vector也可以实现在头部实现插入和删除操作,但是效率非常低,因此SGI的STL并不支持在头部操作元素)。现在我们要学习的双端队列也是占用一段连续内存空间(实际上是逻辑连续,实际内存不一定连续),但是是双向开口的。1、deque和vector的最大差异原创 2016-07-11 22:41:55 · 707 阅读 · 0 评论 -
STL序列式容器之堆栈——stack
stack其实是一个配接器(adapter),因为SGI的STL缺省情况下是以deque作为底层结构的,即修改某物接口,形成另一种数据结构。到目前为止,我们总结一下学过的容器的压入和弹出操作。vector:只能在尾端操作,push_back, pop_back;list:由于stl中的list是一个双向环状链表,可以在头部和尾部进入操作,push_front,push_back,pop原创 2016-07-11 22:56:00 · 573 阅读 · 0 评论 -
STL序列式容器之队列——queue
上一节我们学习的stack是后入先出,这一节学的队列queue遵循先入先出的规则。同stack一样,queue的压入和弹出元素操作为push和pop操作。学习queue可以和stack进行对照,两者基本的框架和思路都是一样的。比如1、queue也没有迭代器。2、queue缺省情况下也是以双端队列deque为底层结构。3、queue也可以以list为底层结构,如#incl原创 2016-07-11 23:02:12 · 609 阅读 · 0 评论 -
STL序列式容器之优先队列——priority_queue
优先队列有一个有权值的队列,由于是一个队列,所以只支持在尾部插入元素,在头部弹出元素,弹出元素的权值最大。由于含有权值,所以优先队列中的元素并未按照被推入的次序进行排序,而是自动按照元素的权值进行排序,权值最高的排在最前面。因此,这就用到我们上一篇博文中学到的堆,STL缺省情况下,是用一个最大堆完成的。由于优先队列只有权值最高的元素才有可能被外界利用,因此优先队列不提供迭代器。由于优先队列原创 2016-07-12 10:55:02 · 892 阅读 · 0 评论 -
STL关联式容器之总览
在上一个系列中,我们学习了STL序列式容器,如vector,list,deque以及某些配接器如stack,queue等。前面我们提过,STL有两种容器,一种即STL序列式容器,另一种即我们即将学习的关联式容器。标准的STL关联式容器有集合(set)和映射表(map),并且还有他们的衍生物——multiset(多键集合)和multimap(多键映射表)。这些容器的底层结构均是红黑树rb-tre原创 2016-07-12 15:48:08 · 446 阅读 · 0 评论 -
STL关联式容器之红黑树
这一节我们来学习红黑树,如果你能够自己实现一个红黑树,那么对它的理解将会更加深刻。1、树的总览根节点到任何节点之间有一条唯一路径。路径长度:指路径所经过的边数。节点的深度:根节点至该节点的路径长度。根节点的深度为0。节点的高度:该节点到其最深叶节点的高度。根节点的高度最大。注意高度和深度的区别。可以这么理解,高度是向上变大的,而深度是向下变大的。节点大小:该节点所有子代原创 2016-07-12 16:48:44 · 1496 阅读 · 0 评论 -
STL关联式容器之集合set
这一节,我们将学习STL关联式容器集合——set。1、set的特性所有元素都会根据元素的键值自动排列,set的键值就是实值,并且set不允许两个元素相同的键值。2、我们可以通过set的迭代器改变set的元素值吗?答案是不行,因为set的元素值就是键值,因此这关系到排列规则,如果我们擅自修改元素值,会破坏set内部的排列规则。也正因为这样,STL的set的迭代器是const_iter原创 2016-07-13 09:28:40 · 580 阅读 · 0 评论 -
STL关联式容器之映射表——map
1、map的特性和set一样,map的元素都会自动根据键值进行自动排列,map的所有元素都是pair类型,同时拥有实值和键值,pair的第一个元素为键值,第二个元素为实值,且map不允许两个键值相同的元素。在学习map之前,我们先学习一下pair。templatestruct pair{ typedef T1 first_type; typedef T2 secon原创 2016-07-13 09:50:10 · 674 阅读 · 0 评论 -
STL关联式容器之散列表——hashtable
以散列表为基础的关联式容器深受人们的喜欢,虽然它们目前还不是STL的标准,但是SGI的STL已经包含了这些内容。前面学习的关联式容器都是基于红黑树这样一种二叉搜索树,也正因为这样,如果要求搜索时间具有对数平均时间,那么需要数据有足够的随机性。而哈希表这种数据结构,在插入、删除、搜索等操作也具有“常数平均时间”的表现,而这种表现是以统计为基础的,不需要依赖数据输入的随机性。原创 2016-07-13 15:58:01 · 875 阅读 · 0 评论 -
字符串实现大数相加
#include#include#include#includeusing namespace std;char int2char(int x){ stringstream s; s char res; s>>res; return res;}int main(){ string str1,st原创 2016-08-10 21:47:36 · 1067 阅读 · 0 评论 -
回溯法案列总结
格雷码转换本来是由一定规律的,但这里使用回溯法实现,具体解释在代码中有。注意n输入的是有多少位。classSolution {public: vector grayCode(int n) { bitset bits;//32位,每一位默认为0。 vector result; help(bits,resu原创 2016-08-28 16:00:32 · 577 阅读 · 0 评论 -
css组合符
css组合符:包括各种简单选择符的组合方式。分类:后代选取器(以空格分隔),子元素选择器(大于号),相邻兄弟选择器(+),普通兄弟选择器(~)(1)后代选取器:div p{background-color:yellow;}既属于div又属于p的区域。(2)子元素选择器div>p{background-color:yellow;}注意:子元素只能作原创 2016-12-27 09:33:23 · 408 阅读 · 0 评论 -
javascript学习基础要点(三)
JavaScript 正则表达式 和 变量提升语法/正则表达式主体/修饰符(可选)使用字符串方法在 JavaScript 中,正则表达式通常用于两个字符串方法 : search() 和 replace()。search() 方法 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。replace() 方法原创 2016-12-28 15:09:20 · 425 阅读 · 0 评论 -
javascript学习基础要点(二)
向未声明的 JavaScript 变量分配值如果您把值赋给尚未声明的变量(未声明),该变量将被自动作为全局变量声明。这条语句:carname="Volvo";将声明一个全局变量 carname,即使它在函数内执行。HTML 中的全局变量在 HTML 中, 全局变量是 window 对象: 所有数据变量都属于 window 对象。原创 2016-12-28 14:26:01 · 359 阅读 · 0 评论 -
javascript学习基础要点(一)
JavaScript 用法HTML 中的脚本必须位于 与 标签之间。脚本可被放置在 HTML 页面的 和 部分中。注:那些老旧的实例可能会在 标签中使用 type="text/javascript"。现在已经不必这样做了。JavaScript 是所有现代浏览器以及 HTML5 中的默认脚本语言。外部的 JavaS原创 2016-12-28 09:54:51 · 491 阅读 · 0 评论 -
给定一个序列,输出所有满足栈规则的所有情况
1、列出全排列2、判断全排列是否可以是对应序列的满足栈规则的输出#include#includeusing namespace std;#includebool isstack(vector in, vector out){ bool res=true; if(in.size()==out.size()){ stack help原创 2016-08-10 20:58:59 · 1633 阅读 · 0 评论 -
连续子数组的最大和
题目:连续子数组的最大和。思路:举个例子:{1,-2,4,5}我们知道前两个数组元素的和是-1,因此后面数组如加上这两个元素将会更小。所以我们设置一个变量currentsum,表示遍历到目前为止的和,若和小于0,那我们设置其为0,继续查找,变量max的值就是要返回的值。具体代码比较简短,这里不在赘述。注:max的更新应该放在判断current是否小于0的前面。不足之处,欢迎批评原创 2016-06-19 21:06:55 · 239 阅读 · 0 评论 -
求输入n个整数中最小的k个数
题目:求输入n个整数中最小的k个数。思路:1、特殊情况判断,如果输入数组为空,或者k大于给定数组长度的,那么输出为空。2、正常情况下,这道题目应该通过构建最小堆算法来实现的,但由于最小堆本身实现比较复杂,在面试的短短几十分钟内很难完成,因此我们在征求面试官的同意后使用stl中的multiset(因为可能出现重复元素)。multiset是基于红黑色的,且元素在其中是自动排序的,因而我们可原创 2016-06-19 20:35:04 · 496 阅读 · 0 评论