微软面试中简单算法题目Word版Word下载.docx
- 文档编号:13812004
- 上传时间:2022-10-13
- 格式:DOCX
- 页数:10
- 大小:18.64KB
微软面试中简单算法题目Word版Word下载.docx
《微软面试中简单算法题目Word版Word下载.docx》由会员分享,可在线阅读,更多相关《微软面试中简单算法题目Word版Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
回答的时候尽量找一些比较有技术性的算法,比如堆排序或者快速排序,如果写冒泡什么的,别人都会写,也就显示不出你的优秀了。
当然一定要注意给定的条件。
不至于三个数让你排序,你搞个快排,这就有点“宰牛刀杀鸡”了。
4.请编写能直接实现strstr()函数功能的代码。
ANSWER首先要知道strstr()这个函数是干什么的,自己去查查C语言的书,一般附录后面会给出C语言标准库的。
这个题目实际上也是一类重要的算法门类,叫做“字符串的模式匹配”。
它有很多的现成算法,其中最简单的要数朴素的匹配算法,还有KMP,BM这些高级算法,笔试估计是来不及写的。
下面给出朴素的匹配算法。
intstringMatching(char*pattern,char*text)
{
intpLen=strlen(pattern),tLen=strlen(text);
for(inti=0;
i<
=tLen-pLen;
i++){
for(intj=0;
pattern[j]==text[i+j];
j++);
if(j==pLen)returni;
}
return-1;
//Notfound
}
或者
char*strstr(constchar*s1,constchar*s2)
assert((s1!
=NULL)&
&
(s2!
=NULL);
char*t1=s1;
char*t2=s2;
while(*s1=='
0\'
)
while(*t1++==*t2++);
if(*t2=='
returnt2;
else
{t2=s2;
s1++;
returnNULL;
}
5.编写反转字符串的程序,要求优化速度、优化空间。
ANSWER:
循环当然是最简单的。
voidreverseString(char*str)
intn=strlen(str);
n/2;
i++)
{intt=str[i];
str[i]=str[n-i-1];
str[n-i-1]=t;
6.在链表里如何发现循环链接?
显然只需要判断是否存在回溯指针就行了。
判断,是否存在某个节点的后继指向其前面位置的指针。
具体实现的时候可以模仿DFS中的访问标志数组的方法,我们可以在structnode中设计该节点的一个访问标志位,设为visited。
每访问一个节点就将其visited域置为1。
这样的话,一次遍历下来,如果发现某个后续节点的visited域已经是1,那么就可以判定其存在循环链接。
具体的代码就不写了,太简单了。
7.写一个函数,检查字符是否是整数,如果是,返回其整数值。
(或者:
怎样只用4行代码编写出一个从字符串到长整形的函数?
分析:
简单!
扫描一遍,每次生成对应整数的最高位。
一行也就搞定了!
longconvert(char*s_string,longs_integer)
for(intsLen=strlen(s_string),i=0;
i<
sLen;
s_integer+=(s_string[i++]-'
0'
)*pow(10,sLen-i-1));
returns_integer;
8.给出一个函数来输出一个字符串的所有排列。
ANSWER简单的回溯就可以实现了。
当然排列的产生也有很多种算法,去看看组合数学,还有逆序生成排列和一些不需要递归生成排列的方法。
印象中Knuth的<
TAOCP>
第一卷里面深入讲了排列的生成。
这些算法的理解需要一定的数学功底,也需要一定的灵感,有兴趣最好看看。
voidpermStr(char*str,inti)
if(i==strlen(str)-1)
printf("
%s\n"
str);
else
{
for(intj=i;
j<
strlen(str);
j++)
swap(&
str[i],&
str[j]);
permStr(str,i+1);
9.给出一个函数来复制两个字符串A和B。
字符串A的后几个字节和字符串B的前几个字节重叠。
anSwer
记住,这种题目往往就是考你对边界的考虑情况。
编程除了技术上的熟练以外,细心也是非常重要的。
其实很多编程的大师可能并不是有特别的技术,往往就是他们非常的耐心和细心,记住:
编程是计算机科学中最基本的工作,它是最容易去掌握的,耐心点,细心点你一定能够学好它。
代码看下面:
char*myStrcpy(char*s,char*a,char*b,charn)
intaLen=strlen(a),bLen=strlen(b);
if(n>
aLen||n>
bLen)
returnNULL;
//Error
aLen+bLen-n;
if(i<
aLen-n)s[i]=a[i];
elses[i]=b[i-aLen+n];
s[i]='
\0'
;
returns;
10.怎样编写一个程序,把一个有序整数数组放到二叉树中?
ANSWER:
二叉搜索树的建树方法。
简单的递归结构。
实在不理解,干脆记下来好了。
关于树的算法设计一定要联想到递归,因为树本身就是递归的定义。
这里的递归应该是理所当然的吧,不过,学会把递归改称非递归也是一种必要的技术。
毕竟,递归会造成栈溢出,关于系统底层的程序中不到非不得以最好不要用。
但是对某些数学问题,就一定要学会用递归去解决。
voidinsertNode(bTree**root,intval)
{
bTree*newNode=(bTree*)malloc(sizeof(bTree));
newNode->
data=val;
lChild=NULL;
rChild=NULL;
if(!
(*root))
*root=newNode;
elseif(newNode->
data<
(*root)->
data)
insertNode(&
(*root)->
lChild,val);
rChild,val);
11.怎样从顶部开始逐层打印二叉树结点数据?
请编程。
ANSWER二叉树的层次遍历没什么好说的,如果你不会还是早点把基础复习一下。
一个劲的往后学,才会发现原来最最重要的还是以前最基础最简单的。
typedefstructmyBinaryTree
intdata;
structmyBinaryTree*lChild;
structmyBinaryTree*rChild;
}bTree;
structmyQueen
bTree*que[QSIZE];
intfront;
intrear;
}binQueue;
//Globalvar
voidinitQueue()
//front==realmakesthequeueempty
binQueue.rear=QSIZE-1;
binQueue.front=binQueue.rear;
QSIZE;
binQueue.que[i]=NULL;
intenQueue(bTree*newNode)
if(binQueue.front>
=1)
binQueue.que[binQueue.front--]=newNode;
elsereturn0;
return1;
bTree*deQueue()
intt;
if(binQueue.front!
=binQueue.rear){
t=binQueue.rear;
binQueue.rear--;
returnbinQueue.que[t];
elsereturnNULL;
intlevelTraversal(bTree**root)
initQueue();
bTree*lc=(bTree*)malloc(sizeof(bTree));
bTree*rc=(bTree*)malloc(sizeof(bTre
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微软 面试 简单 算法 题目 Word
![提示](https://static.bdocx.com/images/bang_tan.gif)