网易互联网笔试
1、计算斐波那契数列的值,要求复杂度小于O(n^2)
2、位运算计算两个数的和
3、图的深度优先搜索(非递归算法)
4、检测CPU大小端
int checkSystem()
{
union check
{
int i;
char ch;
}c;
c.i = 1;
return c.ch == 1;
}
5、有一个很大的文本文件,读出其中的K行(K很小,K行可以放入内存),设计算法,要求每一行读取的概率相等,写出核心算法,复杂度,以及算法原理
yahoo软件开发中心笔试
1、fork()函数的用法
2、字符串中最长的回文
3、(i<j)&& (a[i]>a[j])的数对
小米笔试
1、一个数组中有三个数字出现一次,其他出现两次,打印出三个中的一个
2、n个人,m对关系,最多有几个朋友圈
人人笔试
1、不带头节点循环单链表去连续的重复元素
2、十个加油站,挑选其中一个给其他的送一车油,就最短距离
3、杨辉三角 优化算法
uint64_t f(int x,int y)
{
if(x==0 || y == 0)return 2;
return f(x-1,y)+f(x,y-1);
}
int main()
{
cout<<f(8,8);
return 0;
}
微策略笔试题
1、魔法数:
bool isMagic(int N, int B) 将N转成B进制的数,如果转化后的数字各种数字最多出现一次,返回true
2、节点代替。树中各个节点的值不等
type struct Node{
int mKey;
Node* mparent;
Node* mpLeftChild;
Node* mpRightChild;
};
void replaceNode(Node* rpRoot, int iKey, Node* ipNode)
将根rpRoot所指的树中mKey = iKey的节点找出来,用ipNode节点代替
3、斐波那契数组。
可以简化成这样:27级台阶,每次可以蹦1级或者2级,但是不能经过第5,8,13级,求多少种方法
4、int getIthNum(int n, int l, int i)
在一个集合里,有n位二进制的数,把所有的n位二进制数中1的个数超过l个的元素踢去,剩下的元素组成一个集合,求第i个元素
5、double型数组A[],升序排列,给定M,对于i<j, |M-A[i][j]|最小的值
6、对于n(3~9),任意插入+ 或者 - ,使式子结果为0
例如:n = 7; 1- 2 3 - 4 5 + 6 7 = 0
对于不同的n,求所有满足结果的式子
Atrenta中国研发中心(上海纳拓)
1、FIFO,最多四个元素,设计一个FIFO
2、f(1) = 2, f(2) = 7; f(n)=2*f(n-1)-f(n-2)
3、有序单链表
1)删除值在[n,m]之间的元素
2)merge两个单链表
4、计算表达式的值:
struct Exper{
Code op;//+ - * / blank
int value;
Exper* arg0;
Exper* arg1;
}
计算表达式的值,例如: 1+2-3*5/6
5、计算两条直线的交点
struct Point{
int x;
int y;
};
直线要基于点的结构
6、有一个0、1组成的字符串,按下面规则输出:
1) 前面是字符串长度,再就是'sh,再就是16进制数
2) 最高位是符号位,如果为1则在最前面加1
例如:011010--->6'sh1a
7、元素小于10000个元素的集合S={s1,s2,s3,s4,....,sn},每个元素是一个集合,长度小于1000,判断某个s是不是在S中
例如S={{1,2,3},{1,2},{2,3}},s={2,3,1},s在S中
腾讯笔试
1、哪一种RAID不可靠
2、Class A{
public:
int m_a;
A():m_a(0){}
}
class B : public A
{
public:
int m_a;
B():m_a(2){}
}
A *a = new B()
cout<<a->m_a<<endl;
输出的结果是什么?(0)
3、C++四种类型转化符号
http://blog.sina.com.cn/s/blog_62b0a5e30100sxbs.html
4、腾讯游戏中玩的人最多的是QQ斗地主,有人说机器好就可以得到好牌,但是不是的,在服务器端,每次发牌前 服务器会洗牌,请设计一个洗牌算法 让牌能随机的打乱
#include<fstream>
using namespace std;
#include <ctime>
int main()
{
int i,a[54],b[54],c[54];
for (i =0;i<54;i++)
a[i]=i+1;
ofstream fout("Poker_num.txt",ios::out);
int count=0;
while (true)
{
count++;
for (i=0;i<54;i++)
b[i]=a[i];
for(i=0;i<54;i++)
c[i]=i+1;
for(i=53;i>=1;i--)
swap(c[i], c[rand()%i]);
for (i=0;i<54;i++)
a[i] = b[c[i]-1];
//cout<<count<<"\n";
fout<<count<<"\n";
for (i=0;i<54;i++)
{
//cout<<a[i]<<" ";
fout<<a[i]<<" ";
}
//cout<<"\n\n";
fout<<"\n\n";
}
return 0;
}
科大讯飞
1、静态函数与普通类的成员函数区别
成员函数与静态函数的区别
1、所有函数代码都在程序编译连接时放在一块,称为代码区,无论是静态还是非静态函数都一样,不存在 "构造一个类的对象(第一次构造对象)时,就会给成员函数(非静态成员函数)分配代码区空间 ",而是程序加载时,所有的代码已在内存空间存在. 只有函数中用到的局部变量才是函数调用时分配空间.
2、静态成员函数和成员函数之间根本的区别是:静态成员函数实际上是一个全局函数,不依赖一个类的对象.函数定义时之所以把静态成员函数定义在类中,是一种弱逻辑. 普通成员函数依赖一个类的对象,也就是它有this指针,必须指向一个类的对象.
3、建立类的对象时只是给成员变量分配空间,析构时也只回收这些空间,代码段里的函数以及静态函数和变量都是在程序结束后回收。
内联函数与普通函数的区别
普通函数在编译的过程中由编译器将函数体放入代码段,在调用函数过程中先进行参数的压栈,然后根据函数的调用地址调用函数,并执行,函数返回后执行出栈操作,这样就会有一个调用的过程,会有时间的消耗。内联函数可以避免这样的消耗,一个函数申明为内联函数,在编译的过程中,编译器会将函数体代码插入函数调用处,这样虽然会增加代码段的空间,但是可以避免时间上的消耗,提高了效率。
2、“参数不同但是可以是相同的处理逻辑”
2、将一个字节逆序
#include <stdio.h>
unsigned rev(unsigned X)
{
X=(X&0x55)<<1 | (X&0xAA)>>1;//ABCDEFGH → BADCFEHG
X=(X&0x33)<<2 | (X&0xCC)>>2;//BADCFEHG → DCBAHGFE
X=(X&0x0F)<<4 | (X&0xF0)>>4;//DCBAHGFE → HGFEDCBA
return X;
}
int main()
{
int a;
scanf("%x",&a);
printf("%x",rev(a));
return 0;
}
3、一个类不可以继承,可以实例化,且仅能实例化有限次
在C++ 中没有final 这个关键字,要实现这个要求还是需要花费一些精力。
首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。
class FinalClass1
{
public:
static int count ;//实例化次数
public :
static FinalClass1* GetInstance()
{
if(count<=0)
return 0;
count--;
return new FinalClass1;
}
static void setCount(int n)
{
count = n;
}
static void DeleteInstance( FinalClass1* pInstance)
{
delete pInstance;
pInstance = 0;
}
private :
FinalClass1() {}
~FinalClass1() {}
};
//测试函数
#include<stdio.h>
int FinalClass1::count=0;
void main()
{
FinalClass1::setCount(3);
FinalClass1 *f1 = FinalClass1::GetInstance();
FinalClass1 *f2 = FinalClass1::GetInstance();
FinalClass1 *f3 = FinalClass1::GetInstance();
if (f3==NULL)
printf("f3 NULL\n");
else
printf("f3 Not NULL\n");
FinalClass1 *f4 = FinalClass1::GetInstance();
if (f4==NULL)
{
printf("f4 NULL\n");
}
FinalClass1 *f5 = FinalClass1::GetInstance();
if (f5==NULL)
{
printf("f5 NULL\n");
}
}
4、带空格的字符串,先输出字符串再输出字符
//注意:用gets接受输入的字符串
void Output(char *str)
{
char *p = str;
int count=0;
while (*str != '\0')
{
if (*str == ' ')
count++;
str++;
}
while (count--)
{
printf(" ");
}
while (*p != '\0')
{
if (*p != ' ')
printf("%c",*p);
p++;
}
}
百度笔试题
简答题:
1、列举几种常用的Hash算法,说明Hash算法的用途。
http://blog.csdn.net/hupanfeng/article/details/6221944
http://yuhuafx.blog.hexun.com/58369610_d.html#
2、OSI模型有哪几层,HTTP协议工作在哪一层上
3、简述一个C语言程序运行所必须的东西和执行过程
算法题:
1、一车苹果,每3个装一袋剩2个,每5个装一袋剩3个,每7个装一袋剩2个,求满足此条件的N个解
void GetNResult(int N, int* A)
{
int count=0;
for (int i=1;count < N; i++)
{
if ((21*i-1)%5 == 0)
A[count++]=21*i+2;
}
}
2、用递归的算法,计算一个字符串中最长连续字符的问题。例如:aaabbccc→3,abbc→2
int getNum(char *str, int count, int& M)
{
if (*str == '\0')
return M;
char temp = *str;
if (*(++str) == '\0')
{
if (count>M)
M = count;
return M ;
}
if (*str == temp)
count++;
else
{
if (count>M)
M = count;
count = 1;
}
getNum(str,count, M);
}
http://blog.csdn.net/arduousbonze/article/details/4293626
3、大树组问题。一个有序的超过100亿个元素的整型数组,将其分为若干段,每个段的元素个数少于20,将每个段内数据打乱,这样形成了一个新的数组,请将新数组排序,使用效率高的排序算法,分析算法复杂度。
设计题:
有关数据库的设计题。
大众点评笔试题目
1、给定一个正整数,输出分解质因数的表达式。例如,输入90,输出:90=2*3*3*5
int isPrime(int N)
{
if (N == 1)
return 0;
if (N == 2 || N == 3)
return 1;
int m = sqrt(N);
for (int i = 2; i <= m; i ++)
{
if (! (N % i))
return 0;
}
return 1;
}
int PrimeArray(int N, int *A)
{
int i,j=0;
for ( i=2; i < N; i++)
{
if (isPrime(i))
A[j++] = i;
}
return j;
}
void OutPut(int N)
{
if (isPrime(N))
printf("%d=%d\n",N,N);
else
{
int m = N / 2;
int *A;
A = (int *)malloc(m*sizeof(int));
int num = PrimeArray(N,A);
printf("%d=",N);
for (int i=0;i<num;)
{
if (N % A[i] == 0)
{
N = N / A[i];
if (N == 1)
{
printf("%d\n",A[i]);
break;
}
else
printf("%d*",A[i]);
i = 0;
}
else
i++;
}
}
}
2、计算一个树的深度,根的深度为1。函数原型为:
int TreeDepth(BinaryTree *pTreeNode);
struct BinaryTree
{
int data;
BinaryTree* pLeftChild;
BinaryTree* pRightChild;
};
int TreeDepth(BinaryTree *pTreeNode)
{
int m,n;
if (!pTreeNode)
return 0;
m = TreeDepth(pTreeNode->pLeftChild);
n = TreeDepth(pTreeNode->pRightChild);
return (m > n ? m : n) + 1;
}
3、给定一个字符串,找出里面最长的连续不相同字符的个数。例如aadasddfasf,它的最长长度为:4,dfas。