本次试题均精选自百度腾讯公司笔试题,试题及答案来源于网络。
一、编程题
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的比较)
一、编程题
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的比较)