一,C与C++
1 static的作用(中天联科)
static变量存放于静态存储区,static全局变量和static函数仅在当前文件下可见,static局部变量仅能有当前函数控制,且仅初始化一次,默认初始化为0。static成员变量仅有一份实例,需在类外初始化,在类实例化前就能使用,static成员函数在类实例化前就能使用,仅能访问类的静态成员和静态成员函数。
2 sizeof:
int a[2][3]; sizeof(*(a+1)); // 12
3 virtual关键字的使用
申明虚函数以实现动态绑定,即多台;
申明某个类继承虚基类,使公共父类只有一个实例
class A{}; class B:virtual public A {}; class C:virtual public A{}; class D:public B, public C {};
声明纯虚函数,(抽象类,是无法初始化的),此函数必须在继承类中实现。
4 singleton的实现(火花软件)
class Singleton {
public:
static Singleton* GetInstance() {
if(instance == NULL) {
instance = new Singleton();
}
return instance;
}
protected:
Singleton() {
cout<<"construct singleton"<<endl;
}
~Singleton() {
}
private:
static Singleton* instance;
};
5 union的用法(腾讯面试)
6 c++中的virtual如何实现多态(微策略)
利用虚函数表。每个类都有一张虚函数表,记录类中所有虚函数的函数指针,每个对象都有一个额外的虚指针vptr,指向这张虚函数表,当通过指向对象的指针调用虚函数时,根据vptr调用相应的函数版本实现动态绑定。
7 堆溢出与栈溢出危害的区别(极光互动)
栈顶指针指向未知区域,可能造成系统崩溃,不仅仅指错数据而已。
8 函数调用的具体过程(汇编,栈)(极光互动)
9 使用stl的不妥之处(极光互动)
内存碎片,自己处理内存只膨胀不收缩
10 栈中临时变量的具体情况,什么叫自动销毁,自动清除(极光互动)
11 什么情况下自己实现链表(极光互动)
12 windows下C++多线程网络编程(极光互动)
13 const的用法
const char * const ch = &a; *前面的const指明指针指向的内容不可改变,*后面的const指明指针本身不能变
参数用const修饰表明该变量不能变,返回值为const表明返回的值类型为const(一般用于操作符重载),与普通const相同
const修饰成员函数放在函数声明后面,表明不能修改数据成员
A f; const A& e = f;//这样e只能访问f的const成员函数
14 构造函数,析构函数,拷贝构造函数
子类会首先调用父类的构造函数,最后调用父类的析构函数。拷贝构造函数是为实现深拷贝,即实现动态内存的拷贝和释放。构造函数不能直接调用。构造函数会默认先将类的成员对象初始化。函数调用结束时会自动析构对象。
15 内部类(汤森路透机试)
内部类对象默认初始化与普通成员对象一样,由构造函数在最开始进行。内部类的访问需用外部类标号。
16 函数指针
注意加括号
int fun1(int a) {cout<<a<<endl;return a;};
int fun2(int a) {cout<<100+a<<endl;return 100+a;};
int (*ptr[2])(int);
ptr[0] = fun1;
ptr[1] = fun2;
(*(ptr[0]))(5);//or ptr[0](5)
(*(ptr[1]))(6);
17 a+++b(联想研究院)
int a = 5; int b = 10; int c = a+++b; //a=6 b=10 c=15
18 int *a[10] 与 int (*a)[10]的区别(联想研究院)
前者为指针数组,后者为指向数组的指针。前者sizeof(a)为10后者sizeof(a)为4
19 C的几个库函数的实现 memcpy strcpy atoi memset
20 memcpy函数的内部具体实现内存,越详细越好。(marvell电面)
页表将虚拟地址转换成物理地址,TLB命中,缓存,内存,虚存。
21 virtual析构函数的作用(marvell电面)
C++有明确的说法是,一个类作为基类时,如果其析构函数不声明成virtual,那么指向派生类的基类指针在析构时的行为不可知。
22 try{} catch(Exception e) {}的整个过程 (intel终面)
23 do {} while(0);的用法与宏 (intel终面)
24
#pragma pack(push)
#pragma pack(0)
struct s{
int a;
char b;
unsigned short c;
//...
}
#pragma pack(pop)
what does the above code segment mean? (IGT笔试)
25 what is overloading and overidding in C++? (IGT笔试)
26 char *a = "daf"; sizeof(a) = ? (IGT笔试)
27 what is v-table and v-ptr? what is the relationship? (IGT笔试)
28 what is the difference between vector and List in stl? (IGT笔试)
29 what is DLLMain()? how is it called?(IGT笔试)
30 what is pure virtual function? what is its usage?(IGT笔试)
31 what is the shallow and deep cpoying of objects in C++?(IGT笔试)
32 malloc, realloc, calloc的区别(IGT笔试)
33 #define一些内容(曙光笔试)
34 文件读写,输入输出(polycom笔试)
35 写一个用C++面向对象来解决问题的例子(marvell)
36 写一个用C中指针来解决问题的例子(marvell)
二,数据结构与算法
1 二叉树的建立及非递归遍历(雅虎笔试题)
#include <stack>
#include <iostream>
using namespace std;
class Node {
public:
int data;
Node *left;
Node *right;
};
class Tree {
public:
Node *root;
Tree();
void creat(Node *&node);
//void traverse(Node *node);
};
void Tree::creat(Node (*&node)) {
int a;
cin >> a;
if(a != -1) {
node = new Node();
node->data = a;
creat(node->left);
creat(node->right);
}
else {
node = NULL;
}
}
Tree::Tree() {
creat(root);
}
void traverse(Node *node) {
if(NULL != node) {
traverse(node->left);
cout << node->data << " ";
traverse(node->right);
}
}
void preTraverse(Node *node) {
stack<Node*> st;
Node *T = node;
while(T != NULL || !st.empty()) {
while(T != NULL) {
cout << T->data << " ";
st.push(T);
T = T->left;
}
if(!st.empty()) {
T = st.top();
st.pop();
T = T->right;
}
}
}
void inTraverse(Node *node) {
stack<Node*> st;
Node *T = node;
while(T != NULL || !st.empty()) {
while(T != NULL) {
st.push(T);
T = T->left;
}
if(!st.empty()) {
T = st.top();
st.pop();
cout << T->data <<" ";
T = T->right;
}
}
}
void postTraverse(Node *node) {
stack<Node*> st;
stack<char> flag;
Node *T = node;
while(T != NULL || !st.empty()) {
while(T != NULL) {
st.push(T);
flag.push('0');
T = T->left;
}
if(!st.empty()) {
char f = flag.top();
flag.pop();
if(f == '0') {
flag.push('1');
T = (st.top())->right;
}
else {
cout << (st.top())->data << " ";
st.pop();
}
}
}
}
int main()
{
Tree bitTree;
traverse(bitTree.root);
cout << endl;
preTraverse(bitTree.root);
cout << endl;
inTraverse(bitTree.root);
cout << endl;
postTraverse(bitTree.root);
cout << endl;
return 0;
}
2 输出所有和为n的m个不同自然数()
int fun(int n, int m, int k, int K, int *a) {
if(n <= 0 || m < 1 || (2*k+m-1)*m > 2*n) return 0;
a[K-m] = k;
if(m == 1) {
if(n == k) {
for(int i = 0; i < K; i++) cout << a[i] << " ";
cout << endl;
}
return 0;
}
for(int i = k + 1; i <= (n-k)/(m-1); i++) {
fun(n-k, m-1, i, K, a);
}
return 0;
}
int main() {
int n = 20;
int m = 5;
cout << "input n:";
cin >> n;
cout << "input m:";
cin >> m;
int *a = new int[m];
//int a[5] = {};
for(int i = 1; i <= n/m; i++)
fun(n, m, i, m, a);
delete []a;
return 0;
}
3 给定一个矩阵,从左下角到右上角,每次只能走上,右,或右上,求最短权值路径。简单的动态规划,滚筒数组(yahoo笔试题)
4 建立无向图数据结构,非递归遍历(yahoo笔试题):队列实现BFS,建图最好用邻接表。
5 a1 a2 ... an b1 b2 ... bn 数组转成 a1 b1 a2 b2 ... an bn要求O(n)时间尽可能少的空间(阿里巴巴)
6 dijkstra算法本质上是:贪婪算法,时间复杂度:O(n^2) (yahoo笔试)
7 求两个集合A与B的交集(腾讯面试)
8 从一个50×50迷宫的入口到出口的最短路径(有道笔试)
应该用dijkstra算法,DFS指数复杂度不行,DP不work。
9 求两个"IP区间集合"的交叠区间,设计测试用例(有道笔试)
10 四则运算算法填空,函数指针的应用(腾讯笔试)
11 背包问题(腾讯笔试)
12 判断一棵树是否为二叉排序树(sohu笔试)
13 输出所有的{1,2,2,3,4,5}组成的数字(amazon笔试)
dfs
14 1000,500,100,50,10,5,1分别由某个字符表示,给定一个十进制数转换成字符表示。规则有:10的power不能连续出现三次,500,50,5只能出现一次,各位数和构成总数,(1)(10)表示9.。。。(amazon笔试)
15 求n个数中的第k个,分析并推导出复杂度
16 二分搜索及插入排序
17 写一个队列类并实现其中的函数,给一些测试用例,写一个排序函数(intel终面)
18 链表的倒置(intel终面)
19 拓补排序,节点调度算法(intel终面)
20 given a head node of a single linked list, write a function return the first n node from the last node.(IGT笔试)
21 建图时用邻接表,和用邻接矩阵的优劣,各适合哪种情况。DFS,BFS各适合哪种情况。DFS的递归,非递归各适合哪种情况(曙光笔试)
22 输出某组数据的全排列(polycom,amazon)
23 *从一个字符串中查找并删除一个子串(marvell)
24 *快速排序算法,复杂度推导(爱立信)
25 *求第k大元素算法,复杂度推导(微策略)
26 *链表归并程序
27 *dfs,bfs的递归非递归实现
28 50 black ball and 50 white ball, how to put them into two boxes and get the highest chance to get the black ball(microstrategy)
29 kangaroo jump 1 meter or 2 meters in the same probability, design the algorithm to compute the chance to get into the 100 meter trap(microstrategy)
30 100 horses, complete 3 every time, design algorithm to get the full rank?(microstrategy)
三,操作系统
1 内存区域:从低地址到高地址依次为代码区,静态存储区,堆(动态存储区),栈。静态存储区存放全局变量和静态变量,堆存放程序中new或malloc出动态数据,从低地址向高地址存放,由一个个指针链表来指示空闲的虚拟内存,栈存放局部变量和函数的参数,由系统来申请和释放,从高地址向低地址存,函数运行完就销毁。
2 进程与线程:进程是系统分配和调度资源的单位,完成特定的功能,有独立的内存空间,至少由1个线程组成。线程负责具体地并发执行,一般几个线程间共用内存。
3 判断字节大小端:小端指存储某变量时低字节存放在地址空间,大端反之。判断是否为小端:
int i = 1;
char *a = (char *)(&i);
if(*a == 1) cout << "xiaoduan";
union {
int a;
char c;
}u;
u.a = 1;
if(u.c == 1) cout << "xiaoduan";
4 什么是临界资源:指仅能同时被一个进程访问的资源(中天联科)
5 RTOS实时操作系统(中天联科)
6 硬件抽象层(中天联科)
7 多任务消息传递机制(中天联科)
8 超线程技术是什么,如何实现的(intel bits team电面)
9 什么是页表,具体功效(intel bits team电面)
10 描述微内核
11 CISC与RISC的区别
12 x86架构是什么,还有哪些其他架构
13 解释一下分页机制及其作用,虚拟地址到物理地址的转换,如何寻址(intel终面)
14 给一个内存1,2,4,1,2...当缓存预定大小为3,4时,FIFO与LRU的缺页故障数分别是多少,这说明了什么(国家外汇)
15 FCFS和另一种作业调度机制的调度过程和平均周转时间(国家外汇)
16 死锁的必要条件,如何检测和预防死锁(清算中心)
17 解释内存管理单元MMU(marvell)
18 进程间如何通信(marvell)
19 what is the difference between internal fragment and external fragment (microstrategy phone interview)
四,数据库
1,存储过程是什么,有什么优点?
2 SQL语句,两个表的联合怎么写(国家外汇,中国人民银行清算中心)
五,网络
1 TCP IP UDP HTTP的区别(计算中心)
2 请描述三次握手协议(计算中心)
3 多线程编程和网络编程(百度面试)
4 TCP/IP建立连接的过程
5 TCP UDP协议各处在TCP/IP协议的什么层次,有何区别(sohu畅游笔试)
6 IP地址是什么(sohu畅游笔试)
7 星形,总线,等网络模式图,特点(清算中心)
8 smtp,smp,tlb的英文全称(曙光)
9 ISO七层网络协议,TCP/IP四层网络协议,对应关系(曙光)
10 TCP/UDP协议栈的区别(曙光)
11 TCP中sendmessage,recievemessage的过程,数据离开网卡后的过程(曙光)
12 linux下进程间通信手段(曙光)
六,JAVA
1 JAVA的垃圾回收机制是怎么实现的,为什么C++做不到(intel bits team电面)
2 virtual修饰函数与abstract修饰函数的区别,virtual修饰类与abstract修饰类的区别(火花软件)
七,系统设计
1 用户的搜索关键词经常会有重复或相似的,设计系统判断搜索词之间的关系(百度面试)
2 从一个大字符串中找出所有与给定字符串(有几千,几万个)匹配的子串(百度面试)
3 design a library management system (amazon笔试)
4 运用OO和数据库知识设计一个,web2.0的网络购物系统,有朋友,货物,可推荐,写博客等等(amazon笔试)
八,数学
1 什么情况下E(X+Y)=E(X)+E(Y):all the time(yahoo笔试)
九,设计模式
十,UML图
十一,编译原理
1 循环展开与数据分块的作用(计算中心)
2 并行编程的注意点及心得体会(计算中心)
3 如何自动检测程序是否适合并行(intel终面)
控制流图
4 什么是基本块
5 什么是依赖性,相关性,如何去除
6 给一个文法,S->aSbS|bSaS|e,求abab的最左推导及相应的分析树,是否有二义性,这是一个什么文法(国家外汇笔试)
十二,研究方向与项目
1 汉字识别项目的流程和推广(marvell面试)