您的位置:首页 > 其它

公布2012年5月赛CSDN算法达人赛试题及参考答案

2012-06-02 14:29 411 查看
本次试题均精选自百度腾讯公司笔试题,试题及答案来源于网络。

一、编程题

1.给定如下的n*n的数字矩阵,每行从左到右是严格递增, 每列的数据也是严格递增

1 2 3

3 5 6

4 8 9

现在要求设计一个算法, 给定一个数k 判断出k是否在这个矩阵中。 描述算法并且给出时间复杂度(不考虑载入矩阵的消耗)

答案:算法思想:

沿着对角线查找,获得i,使得k位于a[i][i]与a[i+1][i+1]之间。

k只可能存在于a[i][i]对应的右上角矩阵 和a[i+1][i+1]对应的左下角矩阵。

使用递归法继续查找即可。

时间复杂度 O(n)

int searchK(int int_arr[][],int n,int startlow,int startclm,int k)

{

int lefttemp=0;

int downtemp=0;

int i=0;

while(int_arr[startlow+i][startclm+i]<k||i<n)

i++;

if (i==n)

return 0;

else if(arr[i][i]==k)

reuturn 1;

else

return searchK(int_arr,n,startlow,startclm+i,k)+searchK(int_arr,n,startlow+i,startclm,k);

}

2.设 一个64位整型n,各个bit位是1的个数为a个. 比如7, 2进制就是 111, 所以a为3。

现在给出m个数, 求各个a的值。要求代码实现。

答案:

#include <iostream>

#include<vector>

using namespace std;

int count(long long v)

{

int num=0;

while(v)

{

v &=(v-1); //执行效率为V中1的个数,时间复杂度比通过除操作、位操作比较高出很多

num++;

}

return num;

}

void main()

{

vector<long long> arr;

long long i;

cout<<"输入需要计算的数,Ctrl+z 停止" <<endl;

while(cin>>i)

{ //输入随机个数的数,使用Ctrl+z 停止,之后回车键继续。

arr.push_back(i);

};

for(vector<long long>::size_type idx=0;idx!=arr.size();++idx)

{

int n=count(arr[idx]);

cout<<n<<"\n";

}

}

3. 给定一个字符串的集合,格式如:

{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}

要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应

输出

{aaa bbb ccc ddd hhh},{eee fff}, {ggg}

答案:

char *revert(char * str)

{

int n=strlen(str);

int i=0;

char c;

for(i=0;i

{

c=str;

str=str[n-i];

str[n-i]=c;

}

return str;

}

二、逻辑题

1. 有A、B、C、D四个人,要在夜里过一座桥。

他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。

请问,如何安排,能够在17分钟内这四个人都过桥?

答案:

AB先过[2min],A(或B)返回[1min],CD过[10min],B(或A)回来[2min],AB一起过[2min]。共17min。

2. 1-20的两个数把和告诉A,积告诉B,A说不知道是多少,B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数是多少?

答案:

有3个:

1 2和2

2 2和3

3 2和4

3. 爸爸,妈妈,妹妹,小强,至少两个人同一生肖的概率是多少?

答案:1-12*11*10*9/12*12*12*12 = 1-55/96 = 41/96

三、基础题

1.频繁的插入删除操作使用什么结构比较合适,链表还是数组?

答案:链表

2.顺序查找的平均时间

答案:(1+2+3+...+n)/n = (n+1)/2

3. for(i=0,sum=0; i<10; ++i,sum+=i);的运行结果

答案:sum = 55

4.不能做switch()的参数类型是:

答案:switch的参数不能为浮点型。

5..不使用其他变量,交换两个整型a,b的值

答案:x = x+y; y = x-y; x = x-y或者a=a∧b;b=a∧b;a=b∧a

6. 写出float x 与“零值”比较的if语句。

if(x>=0.000001 && x<=-0.000001)(x不为0的比较)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: