
算法面试
文章平均质量分 61
游刃有余则成
这个作者很懒,什么都没留下…
展开
-
1.把二元查找树转变成排序的双向链表(树)
1.把二元查找树转变成排序的双向链表(树) 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \4 8 12 16 转换成双向链表4=6=8=10=12=14=16。 首先我们定义的二元查找树 节点的数据结构如下:原创 2012-10-11 20:50:22 · 287 阅读 · 0 评论 -
20.输入一个表示整数的字符串,把该字符串转换成整数并输出
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。 #include int chartoint(char* c);int nowswap(char c);int main(){ char* c = "123456"; int a = chartoint(c); return 0;}原创 2012-10-17 17:08:43 · 622 阅读 · 0 评论 -
21.输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数
2010年中兴面试题编程求解:输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来. 这里选择用递归实现比较方便程序选择用数组记录中间选择数#include //arr是记录数组,n是输入n,m是输入的m,i是当前数组存储位置void fuc(int* arr,int n,int m,in原创 2012-10-21 22:32:12 · 1500 阅读 · 0 评论 -
22.有4张红色的牌和4张蓝色的牌,主持人先拿任意两张
http://blog.youkuaiyun.com/v_JULY_v/article/details/6126444有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在A、B、C三人额头上贴任意两张牌,A、B、C三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,A说不知道,B说不知道,C说不知道,然后A说知道了。请教如何推理,A是怎么知道的。如果用程序,转载 2012-10-22 18:29:56 · 3506 阅读 · 0 评论 -
24.链表操作,单链表就地逆置
链表操作,单链表就地逆置 #include struct ListNode{ int m_nKey; ListNode* m_pNext; ListNode(); ListNode(int n);};void insert(ListNode** root,int n);ListNode* myswap(ListNode* root) ;原创 2012-10-23 22:54:20 · 484 阅读 · 0 评论 -
25.写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)
写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为1原创 2012-10-23 23:25:21 · 886 阅读 · 0 评论 -
26.左旋转字符串(字符串)
题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。 a b c d e f g h 1 2 3 4原创 2012-10-24 00:38:06 · 623 阅读 · 0 评论 -
27.跳台阶问题(递归)
题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。这道题最近经常出现,包括MicroStrategy等比较重视算法的公司都曾先后选用过个这道题作为面试题或者笔试题。 这里用到递归原创 2012-10-24 00:40:32 · 616 阅读 · 0 评论 -
28.整数的二进制表示中1的个数(运算)
题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。 #include int sumone(int n);int main(){ int a=sumone(15); return 0;}原创 2012-10-24 00:52:00 · 693 阅读 · 0 评论 -
23.用最简单,最快速的方法计算出下面这个圆形是否和正方形相交
用最简单,最快速的方法计算出下面这个圆形是否和正方形相交。" 3D坐标系 原点(0.0,0.0,0.0)圆形:半径r = 3.0圆心o = (*.*, 0.0, *.*)正方形:4个角坐标; 1:(*.*, 0.0, *.*)2:(*.*, 0.0, *.*)3:(*.*, 0.0, *.*)4:(*.*, 0.0, *.*)转载 2012-10-23 22:20:59 · 1203 阅读 · 0 评论 -
很经典的C++笔试题(附答案)
1. 以下三条输出语句分别输出什么?char str1[] ="abc";char str2[] ="abc";constchar str3[] ="abc"; constchar str4[] ="abc"; constchar* str5 ="abc";constchar* str6 ="abc";cout << boolalpha转载 2012-10-26 10:28:47 · 365 阅读 · 0 评论 -
3:求子数组的最大和
题目:求子数组的最大和 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n) 。 例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5 ,和最大的子数组为 3, 10, -4, 7, 2 ,因此输出为该子数组的和18 。分析:原创 2012-10-11 15:01:49 · 397 阅读 · 0 评论 -
29.栈的push、pop序列(栈)
题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。 比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,原创 2012-10-27 19:05:39 · 690 阅读 · 0 评论 -
30.在从1到n的正数中1出现的次数(数组)
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。分析:这是一道广为流传的google面试题。 这里可以看成是排列组合的问题,某一位上为1,然后看其他位置上值不同的次数。输入45678,现在百位为6,假设百位为1,那么百位前面的千位和万位的不同次原创 2012-10-27 19:12:23 · 1553 阅读 · 0 评论 -
01背包问题
动态规划的基本思想:将一个问题分解为子问题递归求解,且将中间结果保存以避免重复计算。通常用来求最优解,且最优解的局部也是最优的。求解过程产生多个决策序列,下一步总是依赖上一步的结果,自底向上的求解。动态规划算法可分解成从先到后的4个步骤:1. 描述一个最优解的结构,寻找子问题,对问题进行划分。2. 定义状态。往往将和子问题相关的各个变量的一组取值定义为一个状态。转载 2013-04-15 15:23:22 · 613 阅读 · 0 评论 -
多柱汉诺塔最优算法设计探究
引言汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究。最简单的汉诺塔是三个柱子(A、B、C),因此多柱汉诺塔的柱子个数M≥3。下面从三柱汉诺塔说起,慢慢深入我们要关心的问题。1. 三柱汉诺塔三柱汉诺塔是经典的汉诺塔问题,在算法设计中是递归算法的典型问题。其算法是这样的: 首先把A 柱上面的n- 1 个碟子通过C 柱移到B 柱上【T(n-1)转载 2013-05-15 20:35:49 · 1745 阅读 · 0 评论 -
19.Fibonacci数列
题目:定义Fibonacci数列如下: / 0 n=0f(n)= 1 n=1 / f(n-1)+f(n-2) n=2输入n,用最快的方法求该数列的第n项。分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci作为例子。因此很多程序员对这道题的递归解法非常熟悉,但....呵呵,你知道的。。 这里用到递归,对于输入的你很小时,时间可以原创 2012-10-17 16:26:23 · 721 阅读 · 0 评论 -
17.在一个字符串中找到第一个只出现一次的字符
http://hi.baidu.com/leifenglian/item/d341d8052bd69e3df2eafc63题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。 分析:这道题是2006年google的一道笔试题。 本算法题出自http://blog.youkuaiyun.com/v_JULY_v,感谢v_JULY_v using name转载 2012-10-17 14:32:41 · 430 阅读 · 0 评论 -
18.n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。July:我想,这个题目,不少人已经 见识过了。 这里创建一个链表,单循环,然后逐渐删除!#include struct原创 2012-10-17 16:12:15 · 1010 阅读 · 0 评论 -
2.设计包含min函数的栈(栈)
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。分析: 看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。 在栈里添加一个成员原创 2012-10-12 10:45:53 · 387 阅读 · 0 评论 -
4.在二元树中找出和为某一值的所有路径(树)
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树 10 / \ 5 12 / \ 4 7则打印出两条路径:10, 12和10, 5, 7。二元树节点的数据结构定义为:struct BinaryT原创 2012-10-12 14:48:18 · 425 阅读 · 0 评论 -
5.查找最小的k个元素(数组)
题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 这里先用排序,将原来的数组排序,去前k个值则可以完成任务!但此处并没有要求最后获得的数组是有序的,所以可以创建含k个元素的数组。原数组的0-(k-1)个位置的值直接复制到新建的数组。原始数组从第k个位置开始,每取出一个值,和新建数组的最大值相原创 2012-10-12 15:38:48 · 1473 阅读 · 0 评论 -
6.(数组)腾讯面试题:
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数。 上排的十个数如下: 【0,1,2,3,4,5,6,7,8,9】举一个例子, 数值: 0,1,2,3,4,5,6,7,8,9 分配: 6,2,1,0,0,0,1,0,0,0 0在下排出现了6次,1在下排出现了2次, 2在下排转载 2012-10-12 16:00:18 · 371 阅读 · 0 评论 -
7.微软亚院之编程判断俩个链表是否相交(链表)
今天看了July的一篇经典文章《程序员编程艺术:第九章、闲话链表追赶问题》,因为现在一直复习数据结构有关链表的算法,顺便总结下,学习下July大牛的判断链表是否相交。出处:http://blog.youkuaiyun.com/v_JULY_v 。题目:给出两个单向链表的头指针,判断是否相交。下面是July文章上面的解法:分析:这是来自编程之美上的微软亚院的一道面试题目。请跟着我的思路步步深入(转载 2012-10-12 16:19:40 · 851 阅读 · 0 评论 -
8.此贴选一些 比较怪的题(算法)
1.有两个房间,一间房里有三盏灯,另一间房有控制着三盏灯的三个开关,这两个房间是 分割开的,从一间里不能看到另一间的情况。现在要求受训者分别进这两房间一次,然后判断出这三盏灯分别是由哪个开关控制的。有什么办法呢? 先进有开关的房子,先开A开关,过一段时间关上,再开B开关,然后进入有灯的房子,亮着的灯由B开关控制,用手摸熄灭的两盏灯,热的受A开关控制,剩下的受C开关控制原创 2012-10-12 16:34:33 · 433 阅读 · 0 评论 -
9.判断整数序列是不是二元查找树的后序遍历结果(树)
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11因此返回true。如果输入7、4、6原创 2012-10-15 15:02:05 · 373 阅读 · 0 评论 -
11.求二叉树中节点的最大距离
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。 这里可以求节点的左右子树的高度,然后可以得到一该几点为根的最长路径。遍历书的每一个节点,并在遍历过程中用n记录最大值! #include using namespace std;struc原创 2012-10-15 18:34:24 · 407 阅读 · 0 评论 -
10.翻转句子中单词的顺序
翻转句子中单词的顺序。题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。 这里考虑单词间用的是空格,且没有想 ' 之类的符号出现。 由于本题需要翻转句子,我们先颠倒句子中的原创 2012-10-15 16:23:53 · 455 阅读 · 0 评论 -
微软等公司数据结构+算法面试100题(第1-100题)首次完整亮相
转自july的博客,很有用!微软等公司数据结构+算法面试100题(第1-100题)首次完整亮相 作者:July、2010年12月6日。更新:现今,这100题的答案已经全部整理出来了,微软面试100题2010年版全部答案集锦:http://blog.youkuaiyun.com/v_july_v/article/details/6转载 2012-10-15 14:48:36 · 2050 阅读 · 0 评论 -
12.题目:求1+2+…+n,要求不能使用乘除法
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 考虑到用递归来解决,要结束递归,就要判断,不能用关键词,我们可以考虑用&&来终止递归。 #include int sum(int n);int main(){ using namespace std; int原创 2012-10-15 19:38:56 · 832 阅读 · 0 评论 -
16.输入一颗二元树,从上往下按层打印树的每个结点
题目(微软):输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入 8 / / 6 10/ / / /5 7 9 11输出8 6 10 5 7 9 11。 这里要建一个队列,把左右孩子入队列,然后打印对头节点的值! #include #include using namespace std;原创 2012-10-16 16:05:49 · 367 阅读 · 0 评论 -
13.输出该链表中倒数第k个结点
题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下: struct ListNode{ int m_nKey; ListNode* m_pNext;};方法一:这里可以先扫描一遍,得到链表的个数。然后找到正数的第N-K个节点,就是要找到的。方法二:先将链表逆置,然后偶顺着找第K个节点。 以上原创 2012-10-16 15:02:26 · 778 阅读 · 0 评论 -
14.在数组中查找两个数,使得它们的和正好是输入的那个数字
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。 这里的数组是已经排序的,所以首先判断 arr[begin]+arr[end] 时候大于给定的数sum,要是大于原创 2012-10-16 15:19:01 · 440 阅读 · 0 评论 -
15.输入一颗二元查找树,将该树转换为它的镜像
题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 8 / / 6 10 // //5 7 9 11输出: 8 / / 10 6 // //11 9 7 5定义二元查找树的结点为:struct BSTreeN原创 2012-10-16 15:59:57 · 449 阅读 · 0 评论 -
输入一个整数n,求从1 到n 这n 个整数的十进制表示中1 出现的次数)
题目:输入一个整数n,求从1 到n 这n 个整数的十进制表示中1 出现的次数。例如输入12,从1 到12 这些整数中包含1 的数字有1,10,11 和12,1 一共出现了5 次。注:这是一道广为流传的google 面试题。 思路一:我们每次判断整数的个位数字是不是1。如果这个数字大于10,除以10 之后再判断个位数字是不是1。(对每一个数x,x先与10取余,转载 2013-08-24 15:37:53 · 1304 阅读 · 0 评论