
算法题
文章平均质量分 62
方寸之间
这个作者很懒,什么都没留下…
展开
-
算法题41 超大数据量遍历查找
1、一个文件,内含一千万行字符串,每个字符串在1K以内,要求找出所有相反的串对,如abc和cba 2、有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。请用5分钟时间,找出重复出现最多的前10条。 算法:建一个红黑树,比如STL中的map1,key为短信的hash值如MD5值,value为该短信出现的次数。同时维护一个另一个只有10个节点的map2,ke原创 2011-05-22 11:41:00 · 4700 阅读 · 0 评论 -
算法题40 在字符串中删除特定的字符。
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。分析:这是一道微软面试题。在微软的常见面试题中,与字符串相关的题目占了很大的一部分,因为写程序操作字符串能很好的反映我们的编程基本功。原创 2011-05-22 04:23:00 · 1761 阅读 · 0 评论 -
算法题39 最长公共子串--动态规划
题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。分析:求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规划题,因此一些重视算原创 2011-05-22 04:21:00 · 1439 阅读 · 0 评论 -
算法题30 颠倒栈
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。分析:就是把栈顶元素依次压入到n, n-1,n-2, ..., 2处。// 递归法颠倒栈#include templatevoid ReverseStack(std::stack& s){ int count = s.size(); while(count >= 0) { T data = s.top(); s.pop(); //原创 2011-05-22 01:58:00 · 1874 阅读 · 0 评论 -
算法题26 从两个排序数列中找到两个数列组合起来中间大的数
题目:已经两个已经排好序的数组,找出两个数组合起来的中间大的数字。要求算法复杂度尽可能低。如:x数组:1,7,9,10,30 y数组:3,5,8,11 则中间大数为:8 双指针同时有序遍历。时间复杂度O((m+n)/2)int GetMaxValue(int a[], int m, int b[], int n){ int maxValue = a[0]; int i = 0, j = 0; int midIndex = (m+n)/2; while(i b[j])原创 2011-05-20 19:14:00 · 2111 阅读 · 0 评论 -
算法题35 复杂链表的复制
题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: struct ComplexNode{ int m_nValue; ComplexNode* m_pNext; ComplexNode* m_pSibling;}; 请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。原创 2011-05-22 04:15:00 · 2706 阅读 · 1 评论 -
算法题27 在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
算法:考虑使用首尾双指针p1, p2,建立存放从头遍历过程中的最大值max,以及从尾遍历过程中的最小值min。首指针从前往后遍历,尾指针从后往前遍历,(不能完全使二者同时滑动)。遍历结束时p1 == p2当p1 当p2 > min时,使p2--当p1>max且p2 p2时,需要修正,使p1 = p2.此种算法时间复杂度为O(n), 空间复杂度为常数。bool FindValue(int data[], int n, int& find){ int maxTemp = data[0], minTemp原创 2011-05-21 02:55:00 · 2933 阅读 · 4 评论 -
算法题38 寻找丑数
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。原创 2011-05-22 04:19:00 · 2608 阅读 · 0 评论 -
算法题37 把数组排成最小的数
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。原创 2011-05-22 04:18:00 · 2107 阅读 · 1 评论 -
算法题36 对称子字符串的最大长度
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。原创 2011-05-22 04:16:00 · 1701 阅读 · 0 评论 -
算法题24 根据上排给出十个数,在其下排填出对应的十个数
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数。 上排的十个数如下: 【0,1,2,3,4,5,6,7,8,9】举一个例子, 数值: 0,1,2,3,4,5,6,7,8,9原创 2011-05-18 00:13:00 · 12629 阅读 · 12 评论 -
数据结构与算法面试题汇编(2)- 海量数据处理
1、从海量日志数据中提取出某日访问百度次数最多的那个IP。 算法思想:分而治之 + Hash1)IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理;2)可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址;3)对于每一个小文件,可以构建一个IP为key原创 2012-04-24 22:09:10 · 1613 阅读 · 0 评论 -
数据结构与算法面试题汇编(1)- 链表的操作与应用
1、给定单链表的头指针和一个结点指针,在O(1)时间删除该结点。算法描述:删除单链表的一个节点需要知道该节点的前驱和后继。实际上找到前驱的平局时间复杂化度就是O(1).传送阵:http://blog.youkuaiyun.com/wcyoot/article/details/64266912、输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。算法描述:定义两个节原创 2012-04-10 17:47:55 · 3458 阅读 · 0 评论 -
算法题28 配对比较---有一堆1万个石头和1万个木头,对于每个石头都有1个木头和它重量一样,把配对的石头和木头找出来
题目1:有一堆1万个石头和1万个木头,对于每个石头都有1个木头和它重量一样,把配对的石头和木头找出来 题目2:有一堆螺栓和螺母,每一个螺栓只可能配一个螺母,螺栓与螺栓之间不能比较,螺母与螺母之间也不可以比较,只有螺栓与螺母之间可以比较,配对所有的螺栓和螺母。 解题思路:此题就是需找两个可比较数列的问题。如果直接比较的话,那就是O(n^2)的复杂度。 设a[1...n],b[原创 2011-05-21 03:11:00 · 8228 阅读 · 1 评论 -
算法题16 二叉树最近公共父节点
找寻二叉树中两个节点的公共父节点中最近的那个节点情况1. 节点只有left/right,没有parent指针,root已知解析:对于此种情形,只需找到两个节点到根节点的路径,然后就相当于两个链表中找公共节点。templatestruct TreeNode1{ T data; TreeNode1* pLChild; TreeNode1* pRChild;};#includ原创 2011-05-17 15:55:00 · 4480 阅读 · 4 评论 -
算法题5 找出两个链表的第一个公共结点
题目:两个单向链表,找出它们的第一个公共结点。链表的结点定义为:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道微软的面试题。微软非常喜欢与链表相关的题目,因此在微软的面试题中,链表出现的概率相当高。如果两个单向链表有公共的结点,也就是说两个链表从某一结点开始,它们的原创 2011-05-17 11:21:00 · 23031 阅读 · 3 评论 -
算法题32 从随机数数组中选取长度不小于3的最长等差数列
题目:求随机数构成的数组中找到长度大于=3的最长的等差数列输出等差数列由小到大: 如果没有符合条件的就输出[0,0].格式:输入[1,3,0,5,-1,6]输出[-1,1,3,5]要求时间复杂度,空间复杂度尽量小 算法分析:1)对于a1,a2,a3为等差数列,那么a3,a2,a1也为等差数列。2)如果一个有n个元素的等差数列首元素为a1,公差为d,那么a1+i原创 2011-05-22 04:10:00 · 4239 阅读 · 5 评论 -
算法题31 输出1到N位的十进制数,N可能很大。
题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。N很大,这就促使我们考虑是否字符数组的形式了。而且字符数组的每个元素均是‘0’~‘9’.void Print1toNDigits(int n){ char* number = new char[n+1]; memset(number, 0, n+1); // n乃位数,逢十进1 int i = 0; whi原创 2011-05-22 03:02:00 · 1745 阅读 · 0 评论 -
算法题29 从一个取值范围为1~N的不重复数列中找出所有满足两数和为N+1的数对
<br />题目:一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。复杂度最好是O(n),如果是O(n2)则不得分。<br /> <br />算法:建立一个map<数列元素值, 对应索引>. 对每个元素i,如果N+1-i不在map中,插入i,否则输出(i, map[i]).复杂度O(n).<br /> <br />#include <map>// ar为不重复的数列,输出ar中所有两原创 2011-05-21 13:09:00 · 4363 阅读 · 1 评论 -
算法题25 数据置换
输入,如何在O(n)的时间,用O(1)的空间,将这个序列顺序改为a1,b1,...,an,bn原创 2011-05-20 01:07:00 · 1144 阅读 · 0 评论 -
算法题14 删除链表结点(时间复杂度为O(1)))
<br />题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:<br />struct ListNode<br />{<br /> int m_nKey;<br /> ListNode* m_pNext;<br />};<br />函数的声明如下:<br />void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);<br />分析:这是一道广为流传的Google面试题,能有转载 2011-05-17 13:23:00 · 3758 阅读 · 0 评论 -
算法题13 求子数组的最大和
<br />题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 <br /><br />例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。<br />分析:本题最初为2005年浙江大学计算机系的考研题的最后一道程序设计题,在2006年里包括google在内的很多知名公司都把本题当作面试题。由于本题在网络转载 2011-05-17 13:20:00 · 1026 阅读 · 0 评论 -
算法题7 排列与组合
<br />题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。<br />分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。<br />我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b原创 2011-05-17 12:20:00 · 1627 阅读 · 0 评论 -
算法题6 找出整数数组中两个只出现一次的数字
<br /> <br />题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。<br />分析:这是一道很新颖的关于位运算的面试题。<br />首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。<br />这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或运算的性质:任何一个数字异或它自己都等于0。也原创 2011-05-17 12:13:00 · 2103 阅读 · 0 评论 -
算法题3 设计包含min函数的栈
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。<br />分析:这是去年google的一道面试题。<br />我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。<br />在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最转载 2011-05-17 11:08:00 · 1099 阅读 · 0 评论 -
算法题2 从上往下遍历二元树
题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。<br />例如输入<br /> 8<br /> / /<br /> 6 10<br /> // //<br /> 5 7 9 11<br />输出8 6 10 5 7 9 11。<br />分析:这曾是微软的一道面试题。这道题实质上是要求遍历一棵二元树,只不过不是我们熟悉的前序、中序或者后序遍历。<br />我们从树的根结点开原创 2011-05-17 11:05:00 · 1013 阅读 · 0 评论 -
算法题21 最快过桥问题
题目:<br />4个人在晚上过一座小桥,过桥时必须要用到手电筒,只有一枚手电筒,每次最多只可以有两人通过, 4个人的过桥速度分别为1分钟、2分钟、5分钟、10分钟,试问最少需要多长时间4人才可以全部通过小桥?<br /> 抽象:<br />N个人过桥,每个人过桥需要的时间为ti(1<=i<=N).每次最多两个人过桥,并且还要回来一个。求最快过桥时间。<br /> <br />输入:每人过桥时间数组,人数(数组元素个数)。<br />输出:最快时间。<br /> 解析:<br /> <br />最佳方案构造原创 2011-05-17 23:45:00 · 13804 阅读 · 4 评论 -
算法题10 求1+2+...+n
<br />题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。<br />分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制。但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度。<br />通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。由于已经明确限制for和while的使用,循环已经不能再用了。同样,递归函数也需要用if语句或者条件转载 2011-05-17 13:15:00 · 1419 阅读 · 0 评论 -
算法题15 穿越沙漠问题,飞机加油问题
<br /> <br />一、问题描述<br />一辆吉普车来到1000km宽的沙漠边沿。吉普车的耗油量为1L/km,总装油量为500L。显然,吉普车必须用自身油箱中的油在沙漠中设几个临时 加油点,否则是通不过沙漠的。假设在沙漠边沿有充足的汽油可供使用,那么吉普车应在哪些地方、建多大的临的加油点,才能以最少的油耗穿过这块沙漠?<br />二、问题分析<br />本题是一个极值问题,要求具有最小的油耗。因此,它的解是唯一的。吉普车在沙漠中建临时油库,是逐步向前推进的,即建好一个油库后,再建下一个油库。为使油原创 2011-05-17 15:50:00 · 11599 阅读 · 5 评论 -
算法题17 整数序列是否连续
题目:一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现;0是例外,可以反复出现。 请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻注意: 5个数值允许是乱序的。比如: 8 7 5 0 6 0可以通配任意数值。比如:8 7 5 0 6 中的0可以通配成9或者4 0可以多次出现。 分析:由于数列不允许重复,那么非0序列中n个元素中,如果最大值-最小值=n-1,那么数列有序,如果有0的序列,非0的最大值-非0最小值//********************原创 2011-05-17 17:18:00 · 1998 阅读 · 0 评论 -
算法题23 在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树 10 / / 5 12 / / 4 7则打印出两条路径:10, 12和10, 5, 7。原创 2011-05-18 00:12:00 · 2767 阅读 · 6 评论 -
算法题22 把二元查找树转变成排序的双向链表(中序遍历)
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14 / / / /4 8 12 16 转换成双向链表4=6=8=10=12=14=16。原创 2011-05-18 00:11:00 · 5935 阅读 · 0 评论 -
算法题11 判断整数序列是不是二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。<br />例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:<br /> 8<br /> / /<br /> 6 10<br /> / / / /<br /> 5 7 9 11<br />因此返回true。<br />如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。转载 2011-05-17 13:16:00 · 886 阅读 · 0 评论 -
算法题20 在1到n中选取若干个数,要求如果选了x就不能选2x和3x,问共有多少种选择方案?
<br /> <br />例如,n=3时答案为5,这5种选法分别为{}, {1}, {2}, {3}, {2,3}。<br />解析:<br />把数字1放在方阵最左下角,然后不断在一个数的右边填上它的两倍,在其上方填上它的三倍。问题就等价地转化为,在方阵中选取若干个格子使得任意两个不相邻,求有多少种选取方案。这是一个经典的带状态压缩的动态规划问题。另外,遇到尚未出现过的数(即除2和3以外的素数)就再开一张新的表,然后用乘法原理把它们各自对应的方案数乘起来就是了。<br />例如当n=20时,最终答案就等于原创 2011-05-17 22:57:00 · 2073 阅读 · 0 评论 -
算法题18 逆序(字符串、整数、单向链表)
1、反转字符串 即使“abcdef”反转结果为“fedcba”。 可知,其实字符串反转就是交换i与n-i-1位置的字符。时间复杂度O(n/2) 代码如下: // 反转字符串void ReverseString(char* pStr){ int n = strlen(pStr); for(int i = 0; i pNext == NULL) return; ListNode temp; temp.pNext = pR原创 2011-05-17 22:22:00 · 1120 阅读 · 0 评论 -
算法题12 查找最小的k个元素
<br /> <br />题目:输入n个整数,输出其中最小的k个。<br />例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。<br />分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。<br />我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入的元素少于k个,则将读入的整数直接放到数组中。否则长度为k的数组已经满了,原创 2011-05-17 13:19:00 · 1449 阅读 · 0 评论 -
算法题9 查找链表中倒数第k个结点
<br />题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:<br />struct ListNode<br />{<br /> int m_nKey;<br /> ListNode* m_pNext;<br />};<br />分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打开我们的思路。<br />既然不能从尾原创 2011-05-17 13:14:00 · 1449 阅读 · 0 评论 -
算法题8 在给定数列中查找和为给定值的两个数字
<br /> <br />题目:输入一个已经按升序排序过的任意实数数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。<br />例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。<br />分析:如果我们不考虑时间复杂度,最简单想法的莫过去先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和是不是等于输入的数字。可惜这种思路需要的时间复杂度是O(n2)。<b原创 2011-05-17 13:06:00 · 2706 阅读 · 0 评论 -
算法题4 在字符串中删除特定的字符
<br />题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。<br />分析:这是一道微软面试题。在微软的常见面试题中,与字符串相关的题目占了很大的一部分,因为写程序操作字符串能很好的反映我们的编程基本功。<br />要 编程完成这道题要求的功能可能并不难。毕竟,这道题的基本思路就是在第一个字符串中拿到一个字符,在第二个字符串中查找一下,看它是不是在第二个字符串转载 2011-05-17 11:10:00 · 3800 阅读 · 1 评论 -
算法题1 整数的二进制表示中1的个数
<br /> <br />题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。<br />分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。<br />一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。现在的问题变成怎样判断一个整数的最右边一位是不是1了。很简单,如果它和整数1作与运算转载 2011-05-17 10:52:00 · 1904 阅读 · 0 评论