微软面试中简单算法题目_第1页
微软面试中简单算法题目_第2页
微软面试中简单算法题目_第3页
微软面试中简单算法题目_第4页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、如有帮助欢迎下载支持算法题1. 链表和数组的区别在哪里?ANSWER主要在基本概念上的理解。但是最好能考虑的全面一点,现在公司招人的竞争可能就在细节上产生,谁比较仔细,谁获胜的机会就大。1)数组在内存中是逐个存放的,也就是说倘若数组的第一个元素在地址 A, 则数组第二个元素就在地址 A+1。而链表则不是,链表每个节点没有相对固定的位置关系。某个节点在地址 A 其后的节点不一定是 A+1,而在内存的其他空闲区域,呈现一种随机的状态。2)数组一旦显式的被申明后,其大小就固定了,不能动态进行扩充。而链表则可以,可以动态生成节点并且添加到已有的链表后面。3) (大家一起想想)2. 编写实现链表排序的一

2、种算法。说明为什么你会选择用这样的方法?ANSWER链表通常是插入排序 , 为什么呢?在数组中插入排序实现时会大量的移动数据从而删除位置不正确的元素, 这是顺序表删除操作的低效性。 从数学的角度,顺序表(即数组)的删除操作是 O(n). 链表就不同,由于其存储位置的不固定性,其删除固定位置的元素只需要 O(1) 的时间,所以整体性能上获得比较大的提高。3. 编写实现数组排序的一种算法。说明为什么你会选择用这样的方法?ANSWER排序算法非常成熟了,实际上排序是研究算法的很有效例子。回答的时候尽量找一些比较有技术性的算法, 比如堆排序或者快速排序, 如果写冒泡什么的,别人都会写,也就显示不出你的

3、优秀了。当然一定要注意给定的条件。不至于三个数让你排序,你搞个快排,这就有点“宰牛刀杀鸡”了。4. 请编写能直接实现 strstr() 函数功能的代码。ANSWER首先要知道 strstr() 这个函数是干什么的,自己去查查 C 语言的书,一般附录后面会给出 C 语言标准库的。这个题目实际上也是一类重要的算法门类,叫做“字符串的模式匹配”。 它有很多的现成算法, 其中最简单的要数朴素的匹配算法,还有 KMP,BM这些高级算法,笔试估计是来不及写的。下面给出朴素的匹配算法。1如有帮助欢迎下载支持int stringMatching(char* pattern,char* text)int pLe

4、n = strlen(pattern),tLen = strlen(text);for(int i = 0;i <= tLen - pLen;i+)for(int j = 0; patternj = texti + j;j+);if(j = pLen) return i;return -1; / Not found或者char * strstr(const char *s1,const char *s2)assert(s1 != NULL) && (s2 != NULL);char *t1 = s1;char *t2 = s2;while(*s1 = '0'

5、;)while(*t1+ = *t2+);if(*t2 ='0')return t2;elset2 = s2;s1+;return NULL;2如有帮助欢迎下载支持5. 编写反转字符串的程序,要求优化速度、优化空间。ANSWER:循环当然是最简单的。void reverseString(char* str)int n = strlen(str);for(int i = 0;i < n/2;i+)int t = stri;stri = strn - i - 1;strn - i - 1= t;6. 在链表里如何发现循环链接?ANSWER:显然只需要判断是否存在回溯指针就行了

6、。 判断,是否存在某个节点的后继指向其前面位置的指针。 具体实现的时候可以模仿 DFS中的访问标志数组的方法,我们可以在 structnode 中设计该节点的一个访问标志位, 设为 visited。每访问一个节点就将其visited域置为 1。这样的话,一次遍历下来,如果发现某个后续节点的 visited 域已经是 1,那么就可以判定其存在循环链接。具体的代码就不写了,太简单了。7. 写一个函数,检查字符是否是整数,如果是,返回其整数值。 (或者:怎样只用 4 行代码编写出一个从字符串到长整形的函数?)分析 :简单!扫描一遍,每次生成对应整数的最高位。一行也就搞定了!long convert(

7、char* s_string,long s_integer)for(int sLen = strlen(s_string), i = 0; i < sLen;s_integer += (s_stringi+ - '0')*pow(10,sLen - i - 1);return s_integer;3如有帮助欢迎下载支持8. 给出一个函数来输出一个字符串的所有排列。ANSWER简单的回溯就可以实现了。当然排列的产生也有很多种算法,去看看组合数学,还有逆序生成排列和一些不需要递归生成排列的方法。印象中Knuth的 <TAOCP>第一卷里面深入讲了排列的生成。这些算

8、法的理解需要一定的数学功底,也需要一定的灵感,有兴趣最好看看。void permStr(char* str,int i)if(i = strlen(str) - 1)printf("%sn",str);elsefor(int j = i;j < strlen(str);j+)swap(&stri,&strj);permStr(str,i + 1);swap(&stri,&strj);9. 给出一个函数来复制两个字符串 A 和 B。字符串 A 的后几个字节和字符串 B 的前几个字节重叠。anSwer 记住,这种题目往往就是考你对边界的考虑

9、情况。编程除了技术上的熟练以外,细心也是非常重要的。 其实很多编程的大师可能并不是有特别的技术,往往就是他们非常的耐心和细心, 记住:编程是计算机科学中最基本的工作, 它是最容易去掌握的,耐心点,细心点你一定能够学好它。代码看下面:4如有帮助欢迎下载支持char* myStrcpy(char* s,char* a,char* b,char n)int aLen = strlen(a),bLen = strlen(b);if(n > aLen | n > bLen)return NULL; / Errorfor(int i = 0;i < aLen + bLen - n;i+)

10、if(i < aLen - n) si = ai;else si = bi - aLen + n;si = '0'return s;10. 怎样编写一个程序,把一个有序整数数组放到二叉树中?ANSWER:二叉搜索树的建树方法。简单的递归结构。实在不理解,干脆记下来好了。关于树的算法设计一定要联想到递归, 因为树本身就是递归的定义。 这里的递归应该是理所当然的吧,不过,学会把递归改称非递归也是一种必要的技术。毕竟,递归会造成栈溢出, 关于系统底层的程序中不到非不得以最好不要用。 但是对某些数学问题,就一定要学会用递归去解决。void insertNode(bTree* ro

11、ot,int val)bTree* newNode = (bTree* ) malloc(sizeof(bTree);newNode->data = val;newNode->lChild = NULL;newNode->rChild = NULL;if(!(*root)5如有帮助欢迎下载支持*root = newNode;else if(newNode->data < (*root)->data)insertNode(&(*root)->lChild,val);elseinsertNode(&(*root)->rChild,va

12、l);11. 怎样从顶部开始逐层打印二叉树结点数据?请编程。ANSWER二叉树的层次遍历没什么好说的, 如果你不会还是早点把基础复习一下。一个劲的往后学,才会发现原来最最重要的还是以前最基础最简单的。typedef struct myBinaryTreeint data;struct myBinaryTree* lChild;struct myBinaryTree* rChild; bTree;struct myQueenbTree* queQSIZE;int front;int rear; binQueue; / Global var6如有帮助欢迎下载支持void initQueue()/

13、front = real makes the queue empty binQueue.rear = QSIZE - 1; binQueue.front = binQueue.rear; for(int i = 0;i < QSIZE;i+)binQueue.quei = NULL;int enQueue(bTree* newNode)if(binQueue.front >= 1)binQueue.quebinQueue.front- = newNode;else return 0;return 1;bTree* deQueue()int t;if(binQueue.front !

14、= binQueue.rear)t = binQueue.rear;binQueue.rear-;7如有帮助欢迎下载支持return binQueue.quet;else return NULL;int levelTraversal(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(&q

15、uot;OVERFLOWn");exit(OVERFLOW); / Allocation Errorp = *root;if(!p) printf("Empty Tree,build itfirst !n");return 0;enQueue(p); / enqueue the root of the treewhile (binQueue.front != binQueue.rear)p = deQueue();printf("%d ",p->data);8如有帮助欢迎下载支持lc = p->lChild;rc = p->r

16、Child;if(lc != NULL)enQueue(lc);if(rc != NULL)enQueue(rc);printf("n");return 1;12. 怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?ANSWER前面说了,最基本的是最重要的。 线性数据结构是学习数据结构的入门,一定要掌握好。微软的题目还是跟国内的公司不一样。 国内的一上来就是些概念,跟考历史一样。typedef struct listNodestruct listNode* link;int data;node;node* getNode(node* newNode,in

17、t val)if(!newNode)9如有帮助欢迎下载支持exit(OVERFLOW);newNode->link = NULL;newNode->data = val;return newNode;/*Insert a new node after p*/int insertNode(node* prev,node* newNode)if(!prev) return 0;newNode->link = prev->link;prev->link = newNode;return 1;/*delete the node after the node prev*/i

18、nt eraseNode(node*prev,node* p)if(p = NULL)return 0;prev->link = p->link;free(p);10如有帮助欢迎下载支持return 1;void buildList(node* head)int value;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);int reverseList(node* head)node* p = head->link;node* q = p->link;if(p = NULL)p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论