微软的面试题.docx

上传人:b****3 文档编号:4467034 上传时间:2022-12-01 格式:DOCX 页数:12 大小:21.04KB
下载 相关 举报
微软的面试题.docx_第1页
第1页 / 共12页
微软的面试题.docx_第2页
第2页 / 共12页
微软的面试题.docx_第3页
第3页 / 共12页
微软的面试题.docx_第4页
第4页 / 共12页
微软的面试题.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

微软的面试题.docx

《微软的面试题.docx》由会员分享,可在线阅读,更多相关《微软的面试题.docx(12页珍藏版)》请在冰豆网上搜索。

微软的面试题.docx

微软的面试题

(说明:

这些题就不是什么花样了,考的是你的基础知识怎么样。

再聪明而没有实学的人都将会被这些题所淘汰。

) 

  1.链表和数组的区别在哪里?

 

  2.编写实现链表排序的一种算法。

说明为什么你会选择用这样的方法?

 

  3.编写实现数组排序的一种算法。

说明为什么你会选择用这样的方法?

 

  4.请编写能直接实现strstr()函数功能的代码。

 

  5.编写反转字符串的程序,要求优化速度、优化空间。

 

  6.在链表里如何发现循环链接?

 

  7.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。

 

  8.写一个函数,检查字符是否是整数,如果是,返回其整数值。

(或者:

怎样只用4行代码编写出一个从字符串到长整形的函数?

) 

  9.给出一个函数来输出一个字符串的所有排列。

 

  10.请编写实现malloc()内存分配函数功能一样的代码。

 

  11.给出一个函数来复制两个字符串A和B。

字符串A的后几个字节和字符串B的前几个字节重叠。

 

  12.怎样编写一个程序,把一个有序整数数组放到二叉树中?

 

  13.怎样从顶部开始逐层打印二叉树结点数据?

请编程。

 

  14.怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?

 

26、用一种算法使通用字符串相匹配。

 

27、颠倒一个字符串。

优化速度。

优化空间。

28、颠倒一个句子中的词的顺序,比如将“我叫克丽丝”转换为“克丽丝叫我”,实现速度最快,移动最少。

 

29、找到一个子字符串。

优化速度。

优化空间。

 

30、比较两个字符串,用o(n)时间和恒量空间。

31、假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。

此外,除一个数字出现两次外,其他所有数字只出现一次。

假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。

如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?

 

32、如何将计算机技术应用于一幢100层高的办公大楼的电梯系统上?

你怎样优化这种应用?

工作日时的交通、楼层或时间等因素会对此产生怎样的影响?

 

33、你如何对一种可以随时存在文件中或从因特网上拷贝下来的操作系统实施保护措施,防止被非法复制?

 

34、你如何重新设计自动取款机?

 

35、假设我们想通过电脑来操作一台微波炉,你会开发什么样的软件来完成这个任务?

 

36、你如何为一辆汽车设计一台咖啡机?

 

37、如果你想给微软的word系统增加点内容,你会增加什么样的内容?

 

38、你会给只有一只手的用户设计什么样的键盘?

 

39、你会给失聪的人设计什么样的闹钟?

 

40、如果你有一个许多部件可以拆卸的时钟,你将它一块块拆开,但是没有记住是怎样拆的。

然后你将各个零件重新组装起来,最后发现有三个重要零件没有放进去。

这时你如何重新组装这个时钟?

 

41、如果你需要学习一门新的计算机语言,你会怎样做?

 

42、假设由你负责设计比尔·盖茨的卫生间。

当然,钱不成问题,但是你不可以和比尔谈。

你会怎样做?

  

43、到目前为止,你遇到的最难回答的问题是什么?

 

44、如果微软公司说,我们愿意投资500万美元用来开发你提出的方案。

那么你会做什么?

为什么?

 

45、如果你将世界上所有的计算机制造商召集起来,告诉他们必须要做一件事,你会让他们做什么事?

 

46、如果你在五年内会得到一笔奖金,你认为会是因为什么?

关注你的成绩的人会是谁?

 

47、你如何教自己的奶奶使用微软excel表格系统?

 

48、为什么当我们在任何一家宾馆打开热水龙头时,热水会马上流出来?

49.你为什么想在微软工作?

50.1.如果只想让程序有一个实例运行,不能运行两个。

象winnamp一样,只能开一个窗口,怎么作?

  2.如何截取键盘的响应,让所有的'a'变成'b'?

  3.apartment在com中有什么用?

为什么要引入这个?

  4.存储过程是什么,有什么用,什么优点?

  5.template有什么特点,什么时候用?

  ★做一个链接表,你为什么要选择这样的方法?

  ★选择一种算法来整理出一个链接表。

你为什么要选择这种方法?

现在用O(n)时间来做。

  ★说说各种股票分类算法的优点和缺点。

  ★用一种算法来颠倒一个链接表的顺序。

现在在不用递归式的情况下做一遍。

  ★用一种算法在一个循环的链接表里插入一个节点,但不得穿越链接表。

  ★用一种算法整理一个数组。

你为什么选择这种方法?

  ★用一种算法使通用字符串相匹配。

  ★颠倒一个字符串。

优化速度。

优化空间。

  ★颠倒一个句子中的词的顺序,比如将“我叫克丽丝”转换为“克丽丝叫我”,实现速度最快,移动最少。

  ★找到一个子字符串。

优化速度。

优化空间。

  ★比较两个字符串,用O(n)时间和恒量空间。

  ★假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。

此外,除一个数字出现两次外,其他所有数字只出现一次。

假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。

如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?

  ★不用乘法或加法增加8倍。

现在用同样的方法增加7倍。

算法题

1.链表和数组的区别在哪里?

ANSWER主要在基本概念上的理解。

但是最好能考虑的全面一点,现在公司招人的竞争可能就在细节上产生,谁比较仔细,谁获胜的机会就大。

1)数组在内存中是逐个存放的,也就是说倘若数组的第一个元素在地址A,则数组第二个元素就在地址A+1。

而链表则不是,链表每个节点没有相对固定的位置关系。

某个节点在地址A其后的节点不一定是A+1,而在内存的其他空闲区域,呈现一种随机的状态。

2)数组一旦显式的被申明后,其大小就固定了,不能动态进行扩充。

而链表则可以,可以动态生成节点并且添加到已有的链表后面。

3)……(大家一起想想)

 

2.编写实现链表排序的一种算法。

说明为什么你会选择用这样的方法?

ANSWER链表通常是插入排序,为什么呢?

在数组中插入排序实现时会大量的移动数据从而删除位置不正确的元素,这是顺序表删除操作的低效性。

从数学的角度,顺序表(即数组)的删除操作是O(n).链表就不同,由于其存储位置的不固定性,其删除固定位置的元素只需要O

(1)的时间,所以整体性能上获得比较大的提高。

 

3.编写实现数组排序的一种算法。

说明为什么你会选择用这样的方法?

ANSWER排序算法非常成熟了,实际上排序是研究算法的很有效例子。

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

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

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

 

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

}

 

 

5.编写反转字符串的程序,要求优化速度、优化空间。

ANSWER:

循环当然是最简单的。

voidreverseString(char*str)

{

        intn=strlen(str);

        for(inti=0;i

        {intt=str[i];str[i]=str[n-i-1];str[n-i-1]=t;}

}

 

6.在链表里如何发现循环链接?

ANSWER:

显然只需要判断是否存在回溯指针就行了。

判断,是否存在某个节点的后继指向其前面位置的指针。

具体实现的时候可以模仿DFS中的访问标志数组的方法,我们可以在structnode中设计该节点的一个访问标志位,设为visited。

每访问一个节点就将其visited域置为1。

这样的话,一次遍历下来,如果发现某个后续节点的visited域已经是1,那么就可以判定其存在循环链接。

具体的代码就不写了,太简单了。

 

7.写一个函数,检查字符是否是整数,如果是,返回其整数值。

(或者:

怎样只用4行代码编写出一个从字符串到长整形的函数?

分析:

简单!

扫描一遍,每次生成对应整数的最高位。

一行也就搞定了!

longconvert(char*s_string,longs_integer)

{

for(intsLen=strlen(s_string),i=0;i

        returns_integer;

}

 

8.给出一个函数来输出一个字符串的所有排列。

ANSWER简单的回溯就可以实现了。

当然排列的产生也有很多种算法,去看看组合数学,还有逆序生成排列和一些不需要递归生成排列的方法。

印象中Knuth的第一卷里面深入讲了排列的生成。

这些算法的理解需要一定的数学功底,也需要一定的灵感,有兴趣最好看看。

voidpermStr(char*str,inti)

{

        if(i==strlen(str)-1)

          printf("%s\n",str);

        else

        {

           for(intj=i;j

           {

                     swap(&str[i],&str[j]);

                     permStr(str,i+1);

                     swap(&str[i],&str[j]);

           }

        }

}

 

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

        for(inti=0;i

                  if(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;

       newNode->lChild=NULL;

       newNode->rChild=NULL;

     if(!

(*root))

           *root=newNode;

   elseif(newNode->data<(*root)->data)

         insertNode(&(*root)->lChild,val);

        else

         insertNode(&(*root)->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;

        for(inti=0;i

          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(bTree));

        bTree*p=(bTree*)malloc(sizeof(bTree));

        if((!

lc)||(!

rc)||(!

p)){

        printf("OVERFLOW\n");

        exit(OVERFLOW);//AllocationError

        }

        p=*root;

        if(!

p){

                  printf("EmptyTree,builditfirst!

\n");

            return0;

        }

        enQueue(p);//enqueuetherootofthetree

     while(binQueue.front!

=binQueue.rear){

      p=deQueue();

           printf("%d",p->data);

           lc=p->lChild;

           rc=p->rChild;

           if(lc!

=NULL)

                     enQueue(lc);

         if(rc!

=NULL)

                     enQueue(rc);

        }

        printf("\n");

        return1;

}

 

12.怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?

ANSWER前面说了,最基本的是最重要的。

线性数据结构是学习数据结构的入门,一定要掌握好。

微软的题目还是跟国内的公司不一样。

国内的一上来就是些概念,跟考历史一样。

typedefstructlistNode

{

        structlistNode*link;

        intdata;

}node;

 

node*getNode(node*newNode,intval)

{

   if(!

newNode)

                  exit(OVERFLOW);

        newNode->link=NULL;

        newNode->data=val;

        returnnewNode;

}

/*

 Insertanewnodeafterp

*/

intinsertNode(node*prev,node*newNode)

{

        if(!

prev)return0;

        newNode->link=prev->link;

        prev->link=newNode;

   return1;

}

/*

 deletethenodeafterthenodeprev

*/

interaseNode(node*prev,node*p)

{

        if(p==NULL)

                  return0;

        prev->link=p->link;

        free(p);

        return1;

}

voidbuildList(node*head)

{

        intvalue;

        node*newNode=(node*)malloc(sizeof(node));

        node*p=head;

        scanf("%d",&value);

        while(value!

=-1){

        newNode=getNode(newNode,value);

        insertNode(p,newNode);

        p=p->link;

        newNode=(node*)malloc(sizeof(node));

        scanf("%d",&value);

        }

}

 

intreverseList(node*head)

{

        node*p=head->link;

        node*q=p->link;

        if(p==NULL){

        printf("Thelistisempty!

\n");

        return0;

        }

        while(q!

=NULL){

   node*newNode=(node*)malloc(sizeof(node));

        newNode=getNode(newNode,q->data);

        insertNode(head,newNode);

        eraseNode(p,q);

        q=(node*)malloc(sizeof(node));//Allocateagain

        q=p->link;

        }

        p->link=NULL;

     return1;

}

 

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

当前位置:首页 > 高中教育 > 语文

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

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