笔试、面试100题(21---40)

来源:互联网 发布:淘宝上传图片的尺寸 编辑:程序博客网 时间:2024/05/16 00:26
第21题 2010年中兴面试题
编程求解:
输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.

 

有点0-1背包的意思。现在有n件物品,且第i件物品的重量为i,背包容量为m, 要求背包恰好装满,问共有多少中不同的装法? 一般的0-1背包是求最值,本题则是求具体的装包的方案。对第i件物品,有拿和不拿两种方案。记录当前的选择,再判断第i-1件物品。 

第22题:
有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在A、B、C三人额头上贴任意两张牌,A、B、C三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,A说不知道,B说不知道,C说不知道,然后A说知道了。请教如何推理,A是怎么知道的。如果用程序,又怎么实现呢? 

第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, *.*)

 

显然,圆和正方形在同一个平面。设正方形边长为x,中心为A,圆心为B。

如果distant( A, B ) < r + x/2, 则必然相交

如果distant( A, B ) < r + x * 2^0.5/2, 则必然不相交

如果r + x/2 < distant( A, B ) < r + x * 2^0.5/2, 则需在具体判断。 

第24题:链表操作,(1).单链表就地逆置,(2)合并链表 

第25题:
写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)
功能:
在字符串中找出连续最长的数字串,并把这个串的长度返回,
并把这个最长数字串付给其中一个函数参数outputstr所指内存。
例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,
outputstr所指的值为123456789 

26.左旋转字符串

题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。

 

        这个题目比较有意思。abcdef => cdefab,最容易想到的办法就是:按块交换,即把字符串分成左右两块,然后互换。时间复杂度O(n),空间复杂度O(n)。题目要求辅助内存为O(1),这该怎么办?

不知道有没有发现结果字符串cdefab翻转后可以得到bafedc。比较bafedc和原字符串abcedf,好像两者之间有点关系。ba翻转得到ab, 同理fedc => cedf。

分析到这里,这时就有了如下的算法:

1.如果要左旋转字符串前x个元素,则先把字符串分为前x个元素看成一个整体A、剩下的看成一个整体B。

2. 然后对A和B分别翻转,最后再对整个字符串翻转即可。

 

简单证明如下:

设字符串为S = AB,且S的逆记为T( S ). 求证:BA = T( T( A ) T( B ) )

证明:T( T( A ) T( B ) ) = T(T( B ) ) T( T( A ) ) = BA

27.跳台阶问题
题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。
求总共有多少总跳法,并分析算法的时间复杂度。

这道题最近经常出现,包括MicroStrategy等比较重视算法的公司
都曾先后选用过个这道题作为面试题或者笔试题。

 

动态规划的题目。设f( n )表示n阶台阶的总跳法

当前位置只可能由两种情况得到:前一个台阶跳一级,前前一个台阶跳两级得到。

即,f(n ) = f( n-1 ) + f( n-2 )。显然,f(1)= 1, f(2) = 2

呵呵,原来是一个fibonacci序列 

28.整数的二进制表示中1的个数
题目:输入一个整数,求该整数的二进制表达中有多少个1。
例如输入10,由于其二进制表示为1010,有两个1,因此输出2。

分析:
这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。见代码。

view plain
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int GetOneCnt( int x )  
  5. {  
  6.     int cnt = 0;  
  7.   
  8.     while( x )  
  9.     {  
  10.         x = x & ( x - 1 );   
  11.         cnt++;  
  12.     }  
  13.     return cnt;  
  14. }  
  15.   
  16. int main()  
  17. {  
  18.     cout << GetOneCnt( 0 ) << endl;  
  19.     return 0;  
  20. }  

29.栈的push、pop序列
题目:输入两个整数序列。其中一个序列表示栈的push顺序,
判断另一个序列有没有可能是对应的pop顺序。
为了简单起见,我们假设push序列的任意两个整数都是不相等的。 

比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。
因为可以有如下的push和pop序列:
push 1,push2,push 3,push 4,pop,push 5,pop,pop,pop,pop,
这样得到的pop序列就是4、5、3、2、1。
但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。 

30.在从1到n的正数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。

例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。
分析:这是一道广为流传的google面试题。

 

动态规划的问题。

设f(n )表示1、2、…、n这n个整数的十进制表示中1出现的次数。

C( n )表示n的十进制表示中1出现的次数。

则,f(n ) = f( n-1 ) + C( n )

怎么求C(n )?当然可以转换为字符串来求。 

31.华为面试题:
一类似于蜂窝的结构的图,进行搜索最短路径(要求5分钟)  

32.有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
例如:  
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40];

 

不知道自己理解的对不对:要使SumA – SumB最小,只要把较小的数放入数组A中,把较大的数放入数组B,然后相减差必然最小。 那如何经过交换实现?总共有2n个数,相当与分成两部分。可以用类似中位数的求法,即求前n小的元素。

33.实现一个挺高级的字符匹配算法:
给一串很长字符串,要求找到符合要求的字符串,例如目的串:123
1******3***2 ,12*****3这些都要找出来,其实就是类似一些和谐系统。。。。。

 

呃,字符串的模糊匹配。有人说用hash,具体该怎么做? 

34.实现一个队列。

队列的应用场景为:一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列

 

一道模拟题。创建一个生产者进程、创建一个消费者进程,模拟整个过程。

35.求一个矩阵中最大的二维矩阵(元素和最大).如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码 

将任意两个行之间的数,按列依次相加,可以转换为一维的最大子序列求和的问题。此题已经讨论好多遍,不解释

36.谷歌笔试:
n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j的队伍中更强的一支。所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order[n]中,比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是 4对3, 5对8。.......胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4对5,直至出现第一名

编程实现,给出二维数组w,一维数组order 和 用于输出比赛名次的数组result[n],求出result。

 

如果,没有要求复杂度,直接实现应该不难。不知道,有没有更好的算法。 

37.有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。 

38.百度面试:
1.用天平(只能比较,不能称重)从一堆小球中找出其中唯一一个较轻的,使用x次天平,最多可以从y个小球中找出较轻的那个,求y与x的关系式。

2.有一个很大很大的输入流,大到没有存储器可以将其存储下来,
而且只输入一次,如何从这个输入流中随机取得m个记录。

3.大量的URL字符串,如何从中去除重复的,优化时间空间复杂度

 

URL去重可以使用Hash,即把大量的URL分配到不同的文件,如散列到1000个不同的文件中。选择Hash函数时,应该满足:相同的URL被映射到相同的文件中。然后,在每个文件内部,使用一般的方法去重。最后,再把所有去重后的文件合并。

问题在于:单个文件内部URL如何去重?比如说有1000W个URL,在理想情况下散列,每个文件内有1w个URL,那么这1w个URL如何去重?

39.网易有道笔试:
(1).求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是 这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。

(2).求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边,
有向图不再连通,描述算法。

 

(1)   任意两个节点间的最大距离是什么?是到最近公共父节点直接的距离和。

(2)   割点如何求?使用DFS。

在深度优先树中,根为割点,当且仅当根有两个或两个以上的子树。

非根节点为割点,当且仅当存在一个后代节点S,从S到该节点无反向边。 

40.百度研发笔试题
1)设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1)。

2)一串首尾相连的珠子(m个),有N种颜色(N<=10),
设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。
并分析时间复杂度与空间复杂度。

3)设计一个系统处理词语搭配问题,比如说 中国和人民可以搭配,则中国人民人民中国都有效。要求:

  *系统每秒的查询数量可能上千次;
  *词语的数量级为10W;
  *每个词至多可以与1W个词搭配

当用户输入中国人民的时候,要求返回与这个搭配词组相关的信息。

 

网上有人说,用贝叶斯分类。具体做法,暂时不懂。



原创粉丝点击