测试各大公司的问题和答案

腾讯试题:const的含义及实现机制

const的含义及其实现机制,比如const int i,如何让I可读?

Const用于指示定义的变量是只读的。

这是在编译过程中完成的,编译器可以直接用一个常数替换对这个变量的引用。

阅读更多信息:

/view/30509.htm

腾讯测试题:统计论坛在线人口分布

求一个论坛的在线人数,假设有一个论坛有2亿个注册ID,每个ID从登录到退出都会在一个日志文件中记录登录时间和退出时间。要求写一个算法,统计一天内用户在论坛的在线分布,采样粒度为秒。

一天有3600 * * 24 = 86400秒。

定义一个长度为86400的整数数组int delta[86400],每个整数对应这一秒内人数的变化值,可以是正的,也可以是负的。开始时将所有数组元素初始化为0。

然后依次读入每个用户的登录时间和退出时间,登录时间对应的整数值加1,退出时间对应的整数值减1。

经过这样的处理,每秒钟的人数被存储在数组中。

定义另一个整数数组,int online_num[86400],长度为86400,每个整数对应这一秒的在线人数。

假设一天开始时论坛的在线人数为0,那么1秒的在线人数_num[0] = delta[0]。n+1秒在线人数[n] =在线人数[n-1]+δ[n]。

通过这种方式,我们可以得到一天中任何时间的在线人数。

腾讯试题:从10G的数中求中位数。

一个文件有10G个整数,排列顺序不对。要求求中位数。内存限制为2G。

我们假设10G整数是64bit。

2G内存可以存储256M的64位整数。

我们可以把64位整数空间平均分成256M个取值范围,用2G内存统计每个取值范围内的整数个数。这样遍历一个10G的整数后,我们就知道中位数出现在那个区间,有多少个整数总是出现在这个区间。

如果中位数的范围内整数较少,我们可以对这个范围内的整数进行排序,求出中位数。如果这个范围内有很多整数,我们可以用同样的方法把这个范围再分成几个更小的范围(256M=2^28,所以把这个范围缩小到1最多需要三次,求中位数)。

腾讯测试:两个整数集合A和B,求它们的交集。

求两个整数集合a和b的交集。

1.读取整数集合A中的整数,将读取的整数插入到映射中,并将对应的值设置为1。

2.读取整数集合b中的整数,如果该整数在映射中,值为1,则将这个数加到交集上,将映射中对应的值改为2。

通过更改映射中的值,可以避免两次输出相同的值。

腾讯测试:找两个不出现在1到10w的数字。

从1到10w有10W个号码。去掉两个打乱顺序怎么找到那两个数?

申请一个10w位的空间,每个位代表一个数是否曾经出现过。

开始的时候,所有的10w位都初始化为0,表示所有的数字都没有出现过。

然后依次读取已经失序的数字,将对应的位设置为1。

当处理完所有的数字后,根据0的比特位得到缺失的数字。

首先计算1到10w的和以及平方和。

然后计算给定数字的和,平方和。

将两个数相减,可以得到两个数的和,平方和。

所以我们有

x + y = n

x^2 + y^2 = m

x和y的值可以通过解方程得到。

腾讯测试:24小时内需要找到多少只老鼠的毒?

有1000瓶水,其中一瓶有毒。老鼠尝一点毒水会在24小时后死亡。需要多少只老鼠才能在24小时内鉴定出那瓶水有毒?

最容易想到的是用1000只老鼠,每只喝一瓶。但显然这不是最好的答案。

既然每只老鼠喝一瓶不是最好的答案,那你应该每只老鼠多喝几瓶。每人应该喝多少瓶?

首先,我们换一种说法。如果有X只老鼠,你能在24小时内找到多少瓶水,找到那个有毒的瓶子?

因为每只老鼠只有两种结果:死或活,所以X只老鼠最多能代表2 x种结果。如果每个结果都对一瓶水有毒,那么有毒的一瓶水可以从2×瓶水中找到。那么如何实现这种对应呢?

第一只老鼠喝瓶子1到2 (X-1),第二只老鼠喝瓶子1到2 (X-2)和2 (X-1)+1到2 (X-65433)。

回到这个话题,总有1000瓶水,所以至少需要10只老鼠。

腾讯试题:根据上排数字填写下排数字,符合要求。

根据上排给出的十个数字,填写下排对应的十个数字,要求下排每个数字是上排对应位置的数字在下排出现的次数。上排数字:0,1,2,3,4,5,6,7,8,9。

腾讯测试:判断数字是否出现在40亿的数字中?

给40亿个不重复的无符号int整数,无序的,然后再给几个数。如何快速判断这些数字是否在那40亿个数字中?

回答:

无符号int的取值范围是0到2 ^ 32-1。我们可以申请2 32/8 = 512m的连续内存,每一位对应一个无符号的int数。首先,将512M内存初始化为0,然后每次处理一个数时,将相应的位设置为1。需要查询时,直接找到对应的位,看它的值是0还是1。

1.请定义一个宏来比较两个数字A和b的大小,不能使用大于、小于或if语句#define Max(a,b) (a/b)?甲:乙

2.如何输出源文件的标题和当前执行的行数?

int line = _ _ LINE _ _

char * file = _ _ FILE _ _

cout & lt& lt“文件名是”& lt& lt(文件)& lt& lt",行是" & lt

3.两个数相乘,小数点后位数不限。请写一个高精度的算法。

4.编写病毒

while (1)

{

int * p = new int[10000000];

}

5.在不使用额外空间的情况下,A和B链表的元素被合并。

6.序列化树并将其存储在数组或链表中。

结构st{

int I;

短s;

char c;

};

sizeof(struct ST);

7、

char * p 1;

void * p2

int p3

char P4[10];

sizeof(p1...p4) =?

8、

4,4,4,10

二进位检索

快速排序

删除双向链表的节点

面试基本都是和项目有关的,现场输出几个程序性的问题,不能用草稿纸。

微软测试:写一个程序找出二叉树的深度

一棵树的深度等于max(左子树深度,右子树深度)+1。可以使用递归实现。

假设节点被定义为

1 . struct节点{

2.节点*左侧;

3.节点*右;

4.};

5 . int get depth(Node * root){

6 . if(NULL = = root){

7 .返回0;

8.}

9 . int left _ depth = get depth(root-& gt;左);

10 . int right _ depth = get depth(root-& gt;对);

11 . return left _ depth & gt;右_深度?left _ depth+1:right _ depth+1;

12.}

微软试卷:用平衡重把140克盐分成50和90克三次?

有一个天平,一个2克的砝码,一个7克的砝码。如何用平衡重分三次把140克盐分成50,90克?

第一种方法:

第一次:称7+2g盐(相当于2、7、9三个重量)。

第二次:称2+7+9 = 18g盐(相当于2,7,9,18四个重量)。

第三遍:称7+18=x+2,x为23,23+9+18 = 50g盐。

剩下的是90克。

第二种方法:

1.首先把140克盐分成两份,每份70克。

2.将70克分成两份,每份35克。

3.然后在天平两边放两个砝码,将35g面粉分成两份放在两边(15+7=20+2)。

现在有四堆面粉70,35,15,20,分别组合。

70+20=90

35+15=50

微软测试:地球上有多少点符合这样的条件?

站在地球上的某一点,向南走一公里,再向东走一公里,最后向北走一公里,回到原点。地球上有多少个点符合这个条件?

北极符合这个条件。

靠近南极的一圈也满足这个条件。在这个圆上,向南走一公里,然后向东走一公里,正好绕过南极,向北走一公里回到原点。

所以地球上总有无数个点满足这个条件。

或者

首先,在地球表面,南北方向是沿着经度方向,东西方向是沿着纬度方向。如果你一直向北走,你将到达北极,如果你向南走,你将到达南极。所以,向南走一公里,再向东走一公里,最后向北走一公里,回到原点。一种情况,起点在北极,那么向南走一公里,然后向东走任意几公里,最后向北走一公里,最后回到北极;

其次,可以认为,如果从A点到B点向南走一公里,那么向东走一公里,就可以回到B点,然后最后向北走一公里,就可以回到原点A,这样我们就可以先求出南北极周围的圆,只有1公里。那么当这个圆落在南极附近时,我们只需要向北推1公里,这个圆上的所有点就都可以满足了。如果这个圆落在北极附近,我就不分析能不能向北推1 km。不管怎样,如果你能在南极附近找到任意数量的点,你就能回到这个问题上。

微软试卷:正确标记水果篮

有三个水果篮。其中一个只有苹果,一个只有橘子,另一个苹果和橘子都有。每个水果篮上都有标签,但是标签都是错的。如何检查水果篮中的一个水果,并正确标注每个水果篮?

检查一个标有苹果和橘子的水果篮。

如果是橘子,这个篮子里只有橘子;标有橙子的水果篮里只有苹果;标有苹果的水果篮里既有苹果也有橘子。

如果是苹果,这个篮子里只有苹果;标有苹果的水果篮里只有橘子;标有橘子的水果篮里有苹果和橘子。

微软笔测:画圆不用浮点运算

在屏幕上画一个圆,不进行浮点运算(x**2+y**2 = r**2,其中r为正整数)。

考虑到圆的对称性,我们只需要考虑第一象限。

相当于从连接点(0,r)到点(r,0)找一条曲线,曲线上的点最接近圆心(0,0)。

我们可以从点(0,r)开始,搜索三个点到圆心的距离:右(1,r)、下(0,r-1)和右下(1,r-1),选择最接近圆心的点作为下一个点。重复该操作,直到到达点(r,0)。

因为不能使用浮点运算,所以只能在距离的平方的基础上进行距离的比较。那就是比较x**2+y**2和r**2的区别。

微软测试:把一个句子的单词顺序颠倒过来。

把一个句子的词序颠倒过来。比如“hi百度com米安诗缇”逆序改成“米安诗缇com百度hi”。

可以分为两步:

第一步,逆序查找字母,“hi baidu com mianshiti”变成“itihsnaim moc udiab ih”。

第二部分将每个单词中的字母对调,“itihsnaim moc udiab ih”改为“mianshiti com baidu hi”。

这种方法可以在原字符串上进行,只需要几个整数变量来保持指针,空间复杂度低。

微软测试:计算n bit的整数中有多少位是1。

设这个整数为x。

方法1:

让这个整数除以2。如果余数是1,说明最后一位数是1,统计值加上1。

对除法结果执行上述操作,直到结果为0。

方法二:

考虑到除法的高复杂度,可以用移位运算代替除法。

对x & amp;1(x & amp;1),如果结果是1,说明最后一位数是1,统计值是+1。

将x向右旋转一位(x > & gt1),重复上述过程,直到移位后的结果为0。

方法三:

如果需要计数很多个数,内存又足够大,可以考虑将每个数对应的位数记录为1,这样每次计算只是一次搜索操作。

1 . int n = 0;while (x)

2.{

3.xx = x & amp(x-1);

4 . n++;

5.}

6 .返回n;

微软试题:快速找到一个整数的7倍

乘法比较慢,所以快速的办法就是把这个乘法转换成加减和移位运算。

您可以将该整数左移三位(×8),然后减去原始值:x

微软测试:判断一个数是否是2的n次方。

设要判断的数是一个无符号整数x。

先判断x是否为0,如果为0,则不是2的n次方,返回。

X和X-1是按位and运算。如果结果是0,说明这个数是2的n次方。如果结果不是0,说明这个数不是2的n次方。

证明:

如果是2的n次方,这个数用二进制表示时只有一位是1,其他都是0。减去1后,这个位变成0,后面的位变成1,所以按位与的结果是0。

如果不是2的n次方,那么这个数用二进制表示时,有很多位是1。减去1后,只有最后的1变成0,前面的1还是1,所以按位求和结果不是0。

三只蚂蚁不碰撞的概率有多大?

三角形的三个顶点上各有一只蚂蚁。它们移动到另一个顶点,目标是随机的(可能是另外两个顶点中的任何一个)。三只蚂蚁不碰撞的概率有多大?

如果蚂蚁顺时针爬行,记为0,蚂蚁逆时针爬行记为1。那么三只蚂蚁的状态可以是000,001,...,110,11,各状态的概率相等。这八种状态中,只有000和111可以避免碰撞,所以蚂蚁不碰撞的概率是1/4。

微软测试:判断数组是否包含重复数。

给定一个长度为n的数组,每个元素的取值范围是1到n。确定数组中是否有重复的数字。(不需要保留原始数组)

给定一个长度为n的数组,每个元素的取值范围是1到n。确定数组中是否有重复的数字。(不需要保留原始数组)

微软测试:如何把蛋糕切成两等份

有一个长方形小孔的长方形蛋糕(任何角度都可以)。如何用直刀把蛋糕切成两等份?

任何通过矩形中心的直线都可以平分矩形,所以连接两个矩形中心点的直线可以平分蛋糕。

一个无序列表,比如list = {a,l,x,b,e,f,f,e,a,g,h,b,m},请去掉重复的,保持原来的顺序。以上列表是去掉重复项后的新列表= {a,l,x,b,e,f,g。

创建一个hash_map,其中key是链表中已经遍历过的节点的内容,开头为空。

从头开始遍历链表中的节点:

-如果hash_map中已经存在节点内容,则删除该节点,继续向后遍历;

-如果节点内容不在hash_map中,则保留该节点,将节点内容添加到hash_map中,并继续向后遍历。

微软测试:小明一家五口怎么过桥?

小明家过了一座桥,过的时候天很黑,所以一定要有灯。现在小明过桥需要1秒,小明哥哥需要3秒,小明爸爸需要6秒,小明妈妈需要8秒,小明爷爷需要12秒。一次最多两个人可以过桥,过桥的速度取决于最慢的那个,灯亮了30秒就灭了。问:小明家是怎么过桥的?

小明和弟弟过去小明回来,用4s;

妈妈爷爷过去,哥哥回来,用15s;;

小明和弟弟过去小明回来,用4s;

小明和他爸爸用的是6s;

总共* * *有29个..

题目的关键是让速度差不多的人走在一起,不至于太拖累快一点的人。

微软试题:写一个程序求质数之和

写一个程序求素数之和,例如f(7)= 2+3+5+7+11+13+17 = 58。

方法1:

对于从2开始递增的整数n,请执行以下操作:

将n依次除以[2,n-1]中的数。如果余数是0,说明n不是质数。如果所有余数都不为0,说明n是质数,加上去。

空间复杂度为O(1),时间复杂度为O(n ^ 2),其中n为待求的最大素数(示例对应值为17)。

方法二:

你可以维护一个素数序列,所以当你需要判断一个数是否是素数的时候,你只需要判断它是否能被一个比自己小的素数整除。

对于从2开始递增的整数n,请执行以下操作:

在[2,n-1]中用质数(2,3,5,7,此数列开头为空)除n,如果余数为0,则说明n不是质数;如果所有余数都不为0,说明n是素数。把这个质数加到质数序列上,相加。

空间复杂度为O(m),时间复杂度为O(mn),其中m是素数的个数(例子对应的值为7),n是要求的最大素数值(例子对应的值为17)。

方法三:

也可以用加法代替除法。

申请一个足够大的空间,每个位对应一个整数,开始初始化所有位为0。

对于一个已知的质数(开头只有2),把这个质数的所有倍数对应的位数都改成1,那么取最小值为0的位数对应的数就是一个质数。新获得的素数的倍数也被标记。

用这种方法得到的素数序列累加就可以得到素数的和。

空间复杂度为O(n),时间责任为O(n),其中n为待求的最大素数值(示例对应值为17)。