面试100题练习
文章平均质量分 54
MasaWong
烂笔头
展开
-
32. 交换ab中的值,使得差最小
有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小。例如:var a=[100,99,98,1,2, 3];var b=[1, 2, 3, 4,5,40];HANDWRITING:首先求的2数组差D,交换一对数a[i],b[j],则差变化2(a[i] - b[j]原创 2013-09-21 13:25:56 · 879 阅读 · 0 评论 -
14. 排序数组中找和为n的两数
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15 和数字15。由于4+11=15,因此输出4 和11。TRY:void search(int *a, int size, int n) { int原创 2013-09-20 13:15:58 · 928 阅读 · 0 评论 -
74.数组中超过出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。分析:这是一道广为流传的面试题,包括百度、微软和Google 在内的多家公司都曾经采用过这个题目。要几十分钟的时间里很好地解答这道题,除了较好的编程能力之外,还需要较快的反应和较强的逻辑思维能力。HANDWRITING:int search(int a[], int size) { int tmp原创 2013-09-25 09:49:52 · 647 阅读 · 0 评论 -
84. 用不平均概率构造平均概率
已知一随机发生器,产生0 的概率是p,产生1 的概率是1-p,现在要你构造一个发生器,使得它构造0 和1 的概率均为1/2;构造一个发生器,使得它构造1、2、3 的概率均为1/3;...,构造一个发生器,使得它构造1、2、3、...n 的概率均为1/n,要求复杂度最低。HANDWRITING:产生0 的概率是p,产生1 的概率是1-p1、那么01,10的概率是一样的,使原创 2013-09-25 20:10:19 · 689 阅读 · 0 评论 -
3.求子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。TRY:int maxSubarray (int *原创 2013-09-18 13:13:37 · 467 阅读 · 0 评论 -
9. 判断整数序列是不是二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:8/ \6 10/ \ / \5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。TRY:原创 2013-09-18 17:43:27 · 525 阅读 · 0 评论 -
11. 求二叉树中节点的最大距离
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。HANDWRITING:int distance (node *root) { int lh, rh; if (root->m_pLeft == 0) lh = 0; else lh = distance原创 2013-09-18 23:05:34 · 475 阅读 · 0 评论 -
18. 约瑟夫环
题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,每次从这个圆圈中删除第m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m 个数字。求出在这个圆圈中剩下的最后一个数字。TRY:int joseph (int n, int m) { if (n == 0) return 0;原创 2013-09-20 14:12:03 · 482 阅读 · 0 评论 -
25. 在字符串中找出连续最长的数字串
写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr 所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr 后,函数将返回9,outputstr 所指的原创 2013-09-20 19:40:25 · 372 阅读 · 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,pus原创 2013-09-20 20:09:03 · 558 阅读 · 0 评论 -
76.复杂链表的复制
题目:有一个复杂链表,其结点除了有一个m_pNext 指针指向下一个结点外,还有一个m_pSibling 指向链表中的任一结点或者NULL。其结点的C++定义如下:struct ComplexNode { int m_nValue; ComplexNode* m_pNext; ComplexNode* m_pSibling;};下图是一个含有5 个结点的该类型复杂链表。原创 2013-09-25 17:11:02 · 759 阅读 · 0 评论 -
1.把二元查找树转变成排序的双向链表
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \4 8 12 16转换成双向链表4=6=8=10=12=14=16。首先我们定义的二元查找树节点的数据结构如下:struct BSTreeNode{ int m_n原创 2013-09-18 12:31:39 · 585 阅读 · 0 评论 -
12. 求1+2+…+n
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句(A?B:C)。HANDWRITING:1+2+...+n = (1 + n) * n / 2 = (n^2 + n) / 2;int square(int n) {}int sum (int n) { return (square(n原创 2013-09-20 12:53:39 · 711 阅读 · 0 评论 -
13. 链表倒数第K个结点
题目:输入一个单向链表,输出该链表中倒数第k 个结点。链表的倒数第0 个结点为链表的尾指针。链表结点定义如下:struct ListNode{int m_nKey;ListNode* m_pNext;};TRY:ListNode *lastk(ListNode *head, int k) { ListNode *knode = head; while原创 2013-09-20 13:02:52 · 431 阅读 · 0 评论 -
15. 转换二叉查找树
题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例如输入:8/ \6 10/\ /\5 7 9 11输出:8/ \10 6/\ /\11 9 7 5定义二元查找树的结点为:struct BSTreeNode // a node in the原创 2013-09-20 13:43:41 · 411 阅读 · 0 评论 -
20. 字符串转整数
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。TRY:int transform (string num) { if (num.length() == 0) return 0; string::iterator i = num.begin(); int flag = 1, n = 0; if (*i ==原创 2013-09-20 15:10:50 · 484 阅读 · 0 评论 -
2.设计包含min 函数的栈
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。要求函数min、push 以及pop 的时间复杂度都是O(1)。TRY:struct node { int min; int value;};struct myStack { struct node[SET]; int top; void push(node *a); node *pop();原创 2013-09-18 12:49:16 · 476 阅读 · 0 评论 -
7. 微软亚院之编程判断俩个链表是否相交
给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。为了简化问题,我们假设俩个链表均不带环。问题扩展:1.如果链表可能有环列?2.如果需要求出俩个链表相交的第一个节点列?TRY:simple question:bool simpleIntersect(node *h1, node *h2) { if (h1 == 0 || h2 == 0)原创 2013-09-18 17:15:19 · 600 阅读 · 0 评论 -
71. 数值的整数次方
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不需要考虑溢出。分析:这是一道看起来很简单的问题。可能有不少的人在看到题目后30秒写出如下的代码:double Power(double base, int exponent){ double result = 1.0; fo转载 2013-09-23 16:01:58 · 530 阅读 · 0 评论 -
67. 两个闲玩娱乐
1.扑克牌的顺子从扑克牌中随机抽5 张牌,判断是不是一个顺子,即这5 张牌是不是连续的。2-10 为数字本身,A 为1,J 为11,Q 为12,K 为13,而大小王可以看成任意数字。HANDWRITING:大小王当0,5张牌排好序bool straight (int poker[]) { int jokers = 0, i; for (i = 0; poker[原创 2013-09-22 09:33:23 · 1036 阅读 · 0 评论 -
75.二叉树两个结点的最低共同父结点
题目:二叉树的结点定义如下:struct TreeNode { int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight;};输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。HANDWRITING:Tree原创 2013-09-25 09:53:59 · 595 阅读 · 0 评论 -
10. 翻转句子中单词的顺序。
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。TRY:string rollover (string sentence) { string sen = sentence; string::ite原创 2013-09-18 20:25:23 · 520 阅读 · 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,00 在下排出现了6 次,1 在下排出现了2 次,2 在下排出现了1 次,3 在下排出现了原创 2013-09-18 13:38:43 · 527 阅读 · 0 评论 -
22. 推理,猜头上的2张牌
有4 张红色的牌和4 张蓝色的牌,主持人先拿任意两张,再分别在A、B、C 三人额头上贴任意两张牌,A、B、C 三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,A 说不知道,B 说不知道,C 说不知道,然后A 说知道了。请教如何推理,A 是怎么知道的。如果用程序,又怎么实现呢?HANDWRITING:最爱智力题,头上的牌可以是2红,2蓝,红蓝,一共2个条原创 2013-09-20 16:42:15 · 11837 阅读 · 0 评论 -
24. 链表就地逆置
链表操作,(1).单链表就地逆置(2)合并链表HANDWRITING:struct Node {int value;Node *next;};(1).单链表就地逆置Node *reverse (Node *head) { Node *pre = 0, *cur = head, next = head->next; while (nex原创 2013-09-20 18:58:07 · 610 阅读 · 0 评论 -
46.搜狐:四对括号可以有多少种匹配排列方式
四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())HANDWRITING:之前左括号的数量必须比右括号多,即卡特兰数令h(0)=1,h(1)=1,catalan数满足递推式h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)例如:h(2)=h(0)*h(1)+h(1)*h(0)=原创 2013-09-21 16:11:00 · 1386 阅读 · 0 评论 -
48.微软,偏移数组中找数
一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。HANDWRITING:int find(int a[], int start, int end, int k) {if (start > end) return -1;int mid = start + (end - start)原创 2013-09-21 20:04:32 · 527 阅读 · 0 评论 -
54.调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。HANDWRITING:void reset (int a[], int size) { int s = 0, e = size - 1; while (1) { while (a[s] % 2 == 1) ++s; while (原创 2013-09-21 20:41:32 · 485 阅读 · 0 评论 -
47.创新工场:求最长递减子序列
求一个数组的最长递减子序列比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}HANDWRITING:int sequence(int *input, int size, int *&output) { int *len = new int[size]; int max = 1, pos = 0; len[0] = 1; for (int i原创 2013-09-21 18:48:06 · 797 阅读 · 0 评论 -
38. 百度面试
1.用天平(只能比较,不能称重)从一堆小球中找出其中唯一一个较轻的,使用x 次天平,最多可以从y 个小球中找出较轻的那个,求y 与x 的关系式。2.有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入流中随机取得m 个记录。3.大量的URL 字符串,如何从中去除重复的,优化时间空间复杂度HANDWRITING:1原创 2013-09-21 13:48:55 · 626 阅读 · 0 评论 -
51.和为n连续正数序列
这是网易的一道面试题。题目:输入一个正数n,输出所有和为n 连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3 个连续序列1-5、4-6 和7-8。HANDWRITING:想着用1 ~ i 的和偏移 j 个位置,即1+j + 2+j + …+ i+j = n ==> 1 + 2 +…+ i + i * j = n,开写v原创 2013-09-21 20:33:16 · 583 阅读 · 0 评论 -
63.在字符串中删除特定的字符
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”, 则删除之后的第一个字符串变成”Thy r stdnts.”。分析:这是一道微软面试题。在微软的常见面试题中,与字符串相关的题目占了很大的一部分,因为写程序操作字符串能很好的反映我们的编程基本功。HANDWRITING:char *chang原创 2013-09-21 21:52:05 · 540 阅读 · 0 评论 -
61.找出数组中两个只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。HANDWRITING:如果数组里只有1个数字出现1次,其他的都2次,那轻轻松松秒掉2个的话,就轻轻松松的被秒掉,不会。。。来自剑指OFFER的解答:http://zhedahht.blog.163.com/blo转载 2013-09-21 20:53:17 · 567 阅读 · 0 评论 -
66.颠倒栈
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1 在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5 处在栈顶。HANDWRITING:用递归颠倒栈。。折腾。。void reverse (stack s) {if (stack.empty()) return ;int tmp = stack.top();stack.pop();转载 2013-09-21 23:17:44 · 681 阅读 · 0 评论 -
68.把数组排成最小的数
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。分析:这是09 年6 月份百度的一道面试题,从这道题我们可以看出百度对应聘者在算法方面有很高的要求。HANDWRITING:关键问题在于怎么排,从头依次比较数字,小者在前原创 2013-09-22 14:28:23 · 670 阅读 · 0 评论 -
69.旋转数组中的最小元素
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。原创 2013-09-22 14:48:32 · 665 阅读 · 0 评论 -
21. 1~n任意取数组成m
输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数,使其和等于m ,要求将其中所有的可能组合列出来.TRY:void search(int n, int m, int *com, int pos) { if (m == 0) { for (int i = pos - 1; i >= 0; --i) cout<<com[i]<<" "; co原创 2013-09-20 16:07:59 · 749 阅读 · 0 评论