第一场:腾讯笔试
时间:2012/09/23 上午 10:30-12:30
题目比较多,写几个我印象深刻的题目
1. 在sql92标准中 selec 操作和 order by操作的执行顺序
http://www.cnblogs.com/summer_adai/archive/2011/10/28/2227605.html讲得太详细了,总之
--1.from
--2.on
--3.outer(join)
--4.where
--5.group by
--6.cube|rollup
--7.having
--8.select
--9.distinct
--10.order by
--11.top
SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理。
2. C程序中fork()的作用
http://baike.baidu.com/view/1952900.htm 太绕了,不想搞清楚了
http://blog.csdn.net/huangyekan/article/details/7833132这个是原题,我还是没搞明白是怎么弄的
3. n个数入栈,出栈的顺序有多少种
这个问题其实很简单,用动态规划的办法f(n+1)=C(n,0)*f(n)+C(n,1)*f(n-1)+...+C(n,n-1)*f(1)+C(n,n)*f(0);
首先你必须明白一个道理,n个出栈的数组成的串只需要符合一个性质那么它就是一种可能的串,这个性质就是对于这个串的任意一个数字ai,出现在ai后面的比ai小的数必定是降序的。
从n推到n+1,就是把第n+1个数插入到n+1个空格中(这里的空格由前面的n个数生成),从n个数的最左边的空格编号0,1,2,3...n,第n+1个数必定大于前n个数,那么把这个数插入到第i个空格上时,符合前述性质的串应该这样算,这个数的右边的是n-i个数,有C(n,n-i)种选择方法,它们必定是降序排列的,在它的左边是i个数字,这i个数字排列的顺序应该是f(i),所以此时应该存在C(n,n-i)*f(i)个符合要求的串。
4. 我去。。。这么简单的题目给我做错了,根据一个表达式生成它的逆波兰表达式
逆波兰表达式是把运算符号放到式子的后面
波兰表达式是把运算符号放到式子前面
5. 什么是抖动? 产生抖动的原因是什么
a. 抖动(Thrashing)就是指当内存中已无空闲空间而又发生缺页中断时,需要从内存中调出一页程序或
---数据送磁盘的对换区中,如果算法不适当,刚被换出的页很快被访问,需重新调入,因此需再选一页
---调出,而此时被换出的页很快又要被访问,因而又需将它调入,如此频繁更换页面,以致花费大量的
---时间,我们称这种现象为"抖动";
b. 产生抖动的原因是由于CPU的利用率和多道程序度的对立统一矛盾关系引起的,为了提高CPU利用率,
---可提高多道程序度,但单纯提高多道程序度又会造成缺页率的急剧上升,导致CPU的利用率下降,而
---系统的调度程序又会为了提高CPU利用率而继续提高多道程序度,形成恶性循环,我们称这时的进程
---是处于"抖动"状态.
6.FIFO算法与Belady现象
Belady现象
采用FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多,缺页率反而提高的异常现象.
Belady现象的描述
一个进程P要访问M个页,OS分配N个内存页面给进程P;对一个访问序列S,发生缺页次数为PE(S,N).当N增大时,PE(S, N)时而增大,时而减小.
Belady现象的原因
FIFO算法的置换特征与进程访问内存的动态特征是矛盾的,即被置换的页面并不是进程不会访问的.
7.对多叉树经行深度遍历和广度遍历可能出现多处不同的序列,因为多叉树的子树是无序的,你不能光看试卷上的顺序。
8.有一个数据集里面有10TB的无符号整型数据,现在要求这个10TB数据中,出现次数排名前十的整数。
考虑用最笨的数数的办法,内存有限,const int MAX_LENGTH = 1000000; int countFlag[MAX_LENGTH],第一次遍历10TB的数据找出范围在0-999999之间的整数,并对它们进行计数,选出排名前十的留下,其他扔掉;第二次遍历选出1000000-1999999之间的整数,同时计数,选出排名前十的留下,其他扔掉,以此类推。最后全部完成时,在选出的数中再选出排名前十的数就是整个数据集中排名前十的数。(当然,每一次计数是分文件将10TB的数据读入,因为10TB的数据无法放入内存中)
还有一些简单的题目吧,总之就是考基础知识,只怪自己基础知识不够牢靠,说真的,笔试了这么多场,感觉腾讯的卷子确确实实出的是有水平的,考得都是基础知识,但又有那么一点弯。
第二场:下午2:00-3:00 英伟达笔试
就对一个题目印象比较深刻
对一个32位的无符号整型进行位操作,把它的第m位到第n位转化成一个给定的无符号数。
#include<stdio.h>
void replace(unsigned int& source,unsigned int m,unsigned int n,unsigned int increase)
{
//for example source = 1011 1001 0001, increase = 10111
//and m=3 n=7
if(m>32 || n>32) return;
if(m>n)
{
unsigned int temp = m;
m = n;
n = temp;
}
int length = n-m+1; //assert that length=5 in this example
unsigned int number = 0;
for(int i=0;i<length;i++)
number = numeber<<1+1;
//now number is 0000 0000 0001 1111
// source is 0000 1011 1001 0001
number = ~(number<<m); //now number is 1111 1111 0000 0111
source = source&number; //now source is 0000 1011 0000 0001
increase<<m; // increase is 0000 0000 1011 1000
source += increase; // source is 0000 1011 1011 1001
}
int main(int argc, char ** argv )
{
}