微软面试中简单算法题目Word版Word下载.docx

上传人:b****1 文档编号:13812004 上传时间:2022-10-13 格式:DOCX 页数:10 大小:18.64KB
下载 相关 举报
微软面试中简单算法题目Word版Word下载.docx_第1页
第1页 / 共10页
微软面试中简单算法题目Word版Word下载.docx_第2页
第2页 / 共10页
微软面试中简单算法题目Word版Word下载.docx_第3页
第3页 / 共10页
微软面试中简单算法题目Word版Word下载.docx_第4页
第4页 / 共10页
微软面试中简单算法题目Word版Word下载.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

微软面试中简单算法题目Word版Word下载.docx

《微软面试中简单算法题目Word版Word下载.docx》由会员分享,可在线阅读,更多相关《微软面试中简单算法题目Word版Word下载.docx(10页珍藏版)》请在冰豆网上搜索。

微软面试中简单算法题目Word版Word下载.docx

回答的时候尽量找一些比较有技术性的算法,比如堆排序或者快速排序,如果写冒泡什么的,别人都会写,也就显示不出你的优秀了。

当然一定要注意给定的条件。

不至于三个数让你排序,你搞个快排,这就有点“宰牛刀杀鸡”了。

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1