计算机应届毕业生常见面试题目Word文件下载.docx
《计算机应届毕业生常见面试题目Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机应届毕业生常见面试题目Word文件下载.docx(85页珍藏版)》请在冰豆网上搜索。
typedefstructnode
{intdata;
structnode*left;
structnode*right;
}BSTNode;
intInsertBST(BSTNode*&
bt,intk)
{//作为叶子结点插入BST树
if(bt==NULL)
{bt=(BSTNode*)malloc(sizeof(BSTNode));
bt->
data=k;
left=bt->
right=NULL;
return1;
}
if(bt->
data==k)
return0;
data>
k)
returnInsertBST(bt->
left,k);
data<
right,k);
}
voidCreateBST(BSTNode*&
bt,intr[],intn)
{inti;
for(i=0;
i<
n;
i++)
{InsertBST(bt,r[i]);
voidConvertToDLinkList(BSTNode*bt,BSTNode*&
visited)
{BSTNode*cur=bt;
if(cur!
=NULL)
{ConvertToDLinkList(cur->
left,visited);
cur->
left=visited;
if(visited!
visited->
right=cur;
visited=cur;
ConvertToDLinkList(cur->
right,visited);
voidDispDLinkList(BSTNode*bt)
{while(bt!
{printf("
%d"
bt->
data);
bt=bt->
right;
intmain()
{intr[5]={3,88,9,42,16};
BSTNode*bt=NULL;
CreateBST(bt,r,5);
BSTNode*h=NULL;
ConvertToDLinkList(bt,h);
//查找双链表的开始结点
while(h->
left!
h=h->
left;
//逐个打印显示结点值
DispDLinkList(h);
system("
pause"
);
2.设计包含min函数的栈
题目:
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O
(1)。
这是去年google的一道面试题。
我们需要一个辅助栈。
每次push一个新元素的时候,同时将最小元素(或最小元素的位置。
考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;
而每次pop一个元素出栈的时候,同时pop辅助栈。
#defineMaxSize100
typedefstruct
{intdata[MaxSize];
inttop;
}SqStack;
/**
*s作为主要存放数据的栈,t作为辅助栈,存放当前栈中最小元素的下标
*/
voidInitStack(SqStack*&
s,SqStack*&
t)
{s=(SqStack*)malloc(sizeof(SqStack));
t=(SqStack*)malloc(sizeof(SqStack));
s->
top=t->
top=-1;
intPush(SqStack*s,SqStack*t,intdata)
{if(s->
top==MaxSize-1)
top++;
data[s->
top]=data;
if(t->
top==-1)
{t->
t->
data[t->
top]=0;
else
if(data<
s->
top-1]])
top]=s->
top;
top]=t->
top-1];
intPop(SqStack*s,SqStack*t,int&
data)
data=s->
top];
top--;
}
intmin(SqStack*s,SqStack*t)
{assert(s->
top!
=-1&
&
t->
=-1);
returns->
top]];
{SqStack*s,*t;
InitStack(s,t);
Push(s,t,12);
Push(s,t,4);
Push(s,t,-5);
intm;
printf("
%d\n"
min(s,t));
Pop(s,t,m);
3.求子数组的最大和
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
要求时间复杂度为O(n)。
例如输入的数组为1,-2,3,10,-4,7,2,-5,和最大的子数组为3,10,-4,7,2,因此输出为该子数组的和18。
分析:
本题最初为2005年浙江大学计算机系的考研题的最后一道程序设计题,在2006年里包括google在内的很多知名公司都把本题当作面试题。
由于本题在网络中广为流传,本题也顺利成为2006年程序员面试题中经典中的经典。
如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。
不过非常遗憾的是,由于长度为n的数组有O(n2)个子数组;
而且求一个长度为n的数组的和的时间复杂度为O(n)。
因此这种思路的时间是O(n3)。
因为要求是O(N)的复杂度,因此需采用的DP的思想,记录下当前元素之和(为其最优状态,既最大),将其与目前所得的最大和比较,若大于则更新,否则继续。
状态的累加遵循这个过程:
如果当前和小于0,则放弃该状态,将其归零。
很容易理解,当我们加上一个正数时,和会增加;
当我们加上一个负数时,和会减少。
如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。
基于这样的思路,我们可以写出如下代码。
intFindGreatestSubSum(intr[],intn,int&
start,int&
end)
{intmaxSum,curSum;
maxSum=curSum=0;
intcurStart=0,curEnd=0;
for(inti=0;
i<
i++)
{
curSum+=r[i];
curEnd=i;
if(curSum<
0)
{curSum=0;
curStart=i+1;
if(curSum>
maxSum)
{maxSum=curSum;
start=curStart;
end=curEnd;
}
if(maxSum==0){//若是数组中的元素均为负数,则输出里面的最大元素
maxSum=r[0];
//当然这步也可以写到上面一个循环里
intk;
for(inti=1;
i++){
if(maxSum<
r[i]){maxSum=r[i];
k=i;
start=end=k;
returnmaxSum;
{inta[8]={-51,-2,-3,10,-4,-7,-2,-5};
intstart=0,end=0;
cout<
<
FindGreatestSubSum(a,8,start,end)<
endl;
start<
"
"
end;
4.在二元树中找出和为某一值的所有路径
输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数22和如下二元树
512
/\
47
则打印出两条路径:
10,12和10,5,7。
二元树结点的数据结构定义为:
structBinaryTreeNode//anodeinthebinarytree
{
intm_nValue;
//valueofnode
BinaryTreeNode*m_pLeft;
//leftchildofnode
BinaryTreeNode*m_pRight;
//rightchildofnode
};
分析:
这是XX的一道笔试题,考查对树这种基本数据结构以及递归函数的理解。
当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。
如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。
如果当前结点不是叶结点,则继续访问它的子结点。
当前结点访问结束后,递归函数将自动回到父结点。
我们不难看出保存路径的数据结构实际上是一个栈结构,因为路径要与递归调用状态一致,而递归调用本质就是一个压栈和出栈的过程。
源码:
ty