面试
共勉
这个作者很懒,什么都没留下…
展开
-
1.用两个栈实现队列 2.用两个队列实现一个栈
1.用两个栈实现队列编程思想:添加元素全都放入栈sta,出栈元素都从栈stb退出。当stb非空时,直接进行元素出栈实现队列。只有在栈stb为空,且sta非空的情况下,将sta中所有的元素一次性加入stb,(stb为空,sta为空,队列空)再进行元素出栈。Quene核心代码void appendTail( ElementType data)//入队 {原创 2015-04-23 15:53:43 · 615 阅读 · 0 评论 -
希尔排序
希尔排序(Shell Sort)是插入排序的一种。因D.L.Shell于1959年提出而得名。一、基本思想 对待排记录序列先作“宏观”调整,再作“微观”调整。 所谓“宏观”调整,指的是 “跳跃式”的插入排序。即:将记录序列分成若干子序列,每个子序列分别进行插入排序。关键是,这种子序列不是由相邻的记录构成的。假设将n个记录分成d个子序列,则这d个子序列分别为:转载 2015-04-01 19:42:43 · 457 阅读 · 0 评论 -
以K大小为一组反转单链表
例如Example:Inputs: 1->2->3->4->5->6->7->8->NULL and k = 3 Output: 3->2->1->6->5->4->8->7->NULL. Inputs: 1->2->3->4->5->6->7->8->NULL and k = 5Output: 5->4->3->2->1->8->7->6->NULL.原创 2015-09-14 13:29:12 · 618 阅读 · 0 评论 -
字符串匹配的KMP算法
字符串匹配的KMP算法 字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Kn转载 2015-11-04 21:13:39 · 424 阅读 · 0 评论 -
插入排序
直接插入排序折半插入排序二路插入排序表排序希尔排序插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的数据序列的适当位置,直到全部记录插入完成为止。一、基本思想 假设待排序的记录存放在数组R[0…n-1]中。初始时,R[0]自成1个有序区,无序区为R[1…n-1]。从i=1起直至i= n-1为止,依次将R[i]插入转载 2015-04-01 17:24:15 · 478 阅读 · 0 评论 -
堆排序
堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为转载 2015-04-01 20:34:02 · 631 阅读 · 0 评论 -
归并排序
对于排序大列表数据,一个有效的排序算法是归并排序。类似于快速排序算法,其使用的是分治法来排序。归并排序的基本思想是:将两个或两个以上的有序子序列”归并”为一个有序序列。在内部排序中,通常采用的是2-路归并排序。即:将两个位置相邻的有序子序列“归并”为一个有序序列。算法描述归并操作的工作原理如下: 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 设定两转载 2015-04-01 22:02:00 · 663 阅读 · 0 评论 -
快速排序
快速排序是C.R.A.Hoare于1962年提出的一种分区交换排序。它采用了一种分治法(Divide-and-ConquerMethod)策略,分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。快速排序是目前己知的平均速度最快的一种排序方法。一、基本思想 快速排序方法的基本思想是:从待排序的n转载 2015-04-01 15:43:37 · 593 阅读 · 0 评论 -
冒泡排序
基本概念 冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数转载 2015-04-01 16:41:55 · 377 阅读 · 0 评论 -
选择排序
选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的记录序列的最后,直到全部记录排序完毕。一、基本思想 选择排序是一种简单且直观的排序方法。选择排序的做法是:从待排序的记录序列中选择关键码最小(或最大)的记录并将它与序列中的第一个记录交换位置;然后从不包括第一个位置上的记录序列中选择关键码最小(或最大)的记录并将它与序列中的转载 2015-04-01 16:51:01 · 741 阅读 · 0 评论 -
寻找一个字符串中连续出现次数最多的子串
首先要搞清楚题目关于子串的概念。1.一个字符当然也算自串。而题目要求连续出现次数最多的子串。如:abcbcbcabc,连续出现次数最多的子串是bc,连续出现三次。 abcccabc,连续出现次数最多的子串是c,连续出现三次。算法描述首先获得后缀数组:a b c b c b c a b c .substr[0]b c b c b c转载 2015-04-07 13:30:07 · 881 阅读 · 0 评论 -
剑指offer 顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。 分析:第一次看到这个题原创 2015-10-08 16:31:04 · 412 阅读 · 0 评论 -
给定N张扑克牌和一个随机函数,设计一个洗牌算法
假定N=54,首先,我们有一个随机函数发生器,能够产生1-54之间的随机数,如何保证抽第一张牌是54中可能,抽第二张牌是53中可能,……可以这样做,假设扑克牌是一个54维的数组card, 我们要做的就是从这个数组中随机取一个元素,然后在剩下的元素里再随机取一个元素… 这里涉及到一个问题,就是每次取完元素后,我们就不会让这个元素参与下一次的选取。int index=i+rand()%原创 2015-10-11 20:35:11 · 2302 阅读 · 0 评论 -
面试_单链表操作试题_汇总
一、单链表结点的删除0、删除单链表p指向的那个元素,(时间和空间复杂度尽量小)二、单链表的存取1、找出单链表的倒数第K个元素,(仅允许遍历一遍链表)2、找出单链表的中间元素,(仅允许遍历一遍链表)三、单链表与环的问题3、判断单链表是否有环(6形状)?4、如何找到环的入口?5、如何知道环的长度?6、带环链表的转载 2015-04-22 20:45:37 · 381 阅读 · 0 评论 -
剑指offer ——寻找丑数
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n % m == 0。根据丑数的定义,丑数转载 2015-03-31 16:33:21 · 399 阅读 · 0 评论 -
剑指offer 面试题36:数组中的逆序对
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当ia[j],那么我们就称(a[i],a[j])为一个逆序对。在数组{7,5,6,4}中一共存在5对逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5,4)。参考文献转载 2015-04-29 20:32:12 · 394 阅读 · 0 评论 -
华为笔试—在字符串A中删除字符串B中的全部字符
例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。思路:不可避免的是遍历第一个字符串,如果遍历一个字符,都需要去第二个字符串中查找其存不存在,那么复杂度会是O(nm),当然由于字符数有限,所以m是个常量。关于查找速度最快的当然是hash表,对于8位字符,size=2^8足矣。关于删除字符,后面的字符要往前转载 2015-03-31 15:56:35 · 1674 阅读 · 0 评论 -
输入一个链表的头结点,从尾到头反过来输出每个结点的值
题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。看到这道题后,第一反应是从头到尾输出比较简单。于是很自然地想到把链表中链接结点的转载 2015-03-31 14:01:04 · 811 阅读 · 0 评论 -
数据结构 常用的算法的时间复杂度和空间复杂度
转载 2015-04-01 15:42:57 · 730 阅读 · 0 评论 -
100阶乘末尾有多少个零
100阶乘末尾有多少个零 题目:1*2*3*……*100 求结果末尾有多少个零 阶乘末尾一个零,相当于乘以10。 而10 是由2*5所得,我们知道任意一个偶数都含有2,所以2的个数比5多很多,所以只要找0-100中含有5的数的个数就行了。1、 每隔5个,会产生一个0,比如 5, 10 ,15,20.。。 100/5=2原创 2015-04-03 15:15:45 · 1100 阅读 · 1 评论 -
教你如何迅速秒杀99%的海量数据处理面试题
前言 一般而言,标题有“秒杀”,“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收获,那么,我也甘愿背负这样的罪名,:-),同时,此文可以看做是对这篇文章:十道海量数据处理面试题与十个方法大总结的一般抽象性总结。 毕竟受文章和理论之限,本文摒弃绝大部分的细节,只谈方法/模式论,且注重用最通俗最直白的语言阐述相关问题。最后,有一点转载 2015-04-10 22:08:22 · 414 阅读 · 0 评论 -
经典面试题(*****)
腾讯面试题:tcp三次握手的过程,accept发生在三次握手哪个阶段?答accept发生在三次握手之后。第一次握手:客户端发送syn包(syn=j)到服务器。第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个ASK包(ask=k)。第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)。转载 2015-04-11 10:52:17 · 542 阅读 · 0 评论 -
求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。
求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒一天总共有 3600*24 = 86400秒。定义一个长度为86400的整数数组int delta[86400],每个整数对应这一秒的人数变化值,可能为正也可能为负。开始时将数组元素都初始化为0。转载 2015-04-11 10:27:10 · 1267 阅读 · 0 评论 -
美丽的Hash, TOP K(2)
提到Hash,大家都会想到它的“快速存取”,在O(1)时间复杂度里就可以查找到目标元素,或者判断其是否存在,基于Hash我们有HashTable,HashMap等多种数据结构。Hash数据结构里的数据对外是杂乱无序的,我们无法得知其具体存储位置,也不知道各个存储元素位置之间的相互关系,但是我们却可以在常数时间里判断元素位置及存在与否,这不能不说是一个神奇,而这个神奇的创建在数学上却是那么的简单,不转载 2015-04-11 10:22:07 · 410 阅读 · 0 评论 -
在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。
在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。不妨假设10G个整数都是64bit的。2G内存可以存放256M个64bit整数。我们可以将2G的整数内存空间平均分成256M个取值范围,用2G的内存对每个取值范围内出现整数个数进行统计。这样遍历一边10G整数后,我们便知道中数在那个范围内出现,以及这个范围内总共出现了多少个整数。转载 2015-04-11 10:47:09 · 524 阅读 · 0 评论 -
判断字符串d是否是字符串s关于栈的输出序列
由栈的输入输出过程可得一下规律: 如果下一个弹出的数字刚好是栈顶的数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压栈,直到把下一个需要弹出的数字压入栈顶为止。如果所有的数字都压入栈,但是仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。代码如下:#include#includeusing namespace std;原创 2015-04-25 16:29:01 · 555 阅读 · 0 评论 -
实现一个包含Min,Max函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push及pop的时间复杂度都是O(1).注:如果每次都把最小元素压入辅助栈,那么就能保证辅助栈的栈顶一直都是最小元素。当最小元素从数据栈内被弹出之后,同时弹出辅助栈的 栈顶元素,此时辅助栈的新栈顶元素就是下一个最小值。 m_data是数据栈,m_min是辅助栈。vo原创 2015-04-25 11:50:15 · 1137 阅读 · 0 评论 -
典型的Top K算法 _找出一个数组里面前K个最大数_找出1亿个浮点数中最大的10000个_一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存.
Top K 算法详解应用场景: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。转载 2015-04-10 22:10:10 · 3209 阅读 · 0 评论