微软面试中简单的算法题目

微软的100道算法面试题(一) 程序员为什么要学数据结构? 在计算机发展的初期,人们使用计算机的主要目的是处理数值计算问题。使用计算机解决具体问题一般需要经过以下几个步骤:首先从具体问题抽象出适当的数学模型,然后设计或选择解此数学模型的算法,接着编写程序并进行调试、测试,直至得到最终的解答。 由于最初涉及的运算对象是简单的整型、实型或布尔型数据,所以程序设计者的主要精力集中于程序设计的技巧上,而无需重视数据结构。随着计算... 阅读详情

算法题

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这些高级算法,笔试估计是来不及写的。下面给出朴素的匹配算法。

int stringMatching(char* pattern,char* text)

{

         int pLen = strlen(pattern),tLen = strlen(text);

         for(int i = 0;i <= tLen - pLen;i++){

      for(int j = 0; pattern[j] == text[i + j];j++);

                   if(j == pLen) return i;

         }

         return -1; // Not found

}

 

 

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

ANSWER:循环当然是最简单的。

void reverseString(char* str)

{

         int n = strlen(str);

         for(int i = 0;i < n/2;i++)

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

}

 

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

ANSWER: 显然只需要判断是否存在回溯指针就行了。判断,是否存在某个节点的后继指向其前面位置的指针。具体实现的时候可以模仿DFS中的访问标志数组的方法,我们可以在struct node中设计该节点的一个访问标志位,设为visited 。每访问一个节点就将其visited域置为1。这样的话,一次遍历下来,如果发现某个后续节点的visited域已经是1,那么就可以判定其存在循环链接。具体的代码就不写了,太简单了。

 

7.写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)

分析 :简单!扫描一遍,每次生成对应整数的最高位。一行也就搞定了!

long convert(char* s_string,long s_integer)

{

for(int sLen = strlen(s_string), i = 0; i < sLen;s_integer += (s_string[i++] - '0')*pow(10,sLen - i - 1));

         return s_integer;

}

 

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

ANSWER 简单的回溯就可以实现了。当然排列的产生也有很多种算法,去看看组合数学,还有逆序生成排列和一些不需要递归生成排列的方法。印象中Knuth的<TAOCP>第一卷里面深入讲了排列的生成。这些算法的理解需要一定的数学功底,也需要一定的灵感,有兴趣最好看看。

void permStr(char* str,int i)

{

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

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

         else

         {

            for(int j = i;j < strlen(str);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,char n)

{

int aLen = strlen(a),bLen = strlen(b);

         if(n > aLen || n > bLen)

                   return NULL; // Error

         for(int i = 0;i < aLen + bLen - n;i++)

                   if(i < aLen - n) s[i] = a[i];

                   else s[i] = b[i - aLen + n];

                   s[i] = '/0';

                   return s;

}

 

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

ANSWER :二叉搜索树的建树方法。简单的递归结构。实在不理解,干脆记下来好了。关于树的算法设计一定要联想到递归,因为树本身就是递归的定义。这里的递归应该是理所当然的吧,不过,学会把递归改称非递归也是一种必要的技术。毕竟,递归会造成栈溢出,关于系统底层的程序中不到非不得以最好不要用。但是对某些数学问题,就一定要学会用递归去解决。

void insertNode(bTree** root,int val)

{

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

         newNode->data = val;

        newNode->lChild = NULL;

        newNode->rChild = NULL;

      if(!(*root))

            *root = newNode;

    else if(newNode->data < (*root)->data)

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

         else

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

}

 

11.怎样从顶部开始逐层打印二叉树结点数据?请编程。

ANSWER 二叉树的层次遍历没什么好说的,如果你不会还是早点把基础复习一下。一个劲的往后学,才会发现原来最最重要的还是以前最基础最简单的。

typedef struct myBinaryTree

{

         int data;

         struct myBinaryTree* lChild;

         struct myBinaryTree* rChild;

} bTree;

 

struct myQueen

{

         bTree* que[QSIZE];

         int front;

         int rear;

} binQueue; // Global var

 

void initQueue()

{

         // front == real makes the queue empty

         binQueue.rear = QSIZE - 1;

         binQueue.front = binQueue.rear;

         for(int i = 0;i < QSIZE;i++)

           binQueue.que[i] = NULL;

}

 

int enQueue(bTree* newNode)

{

         if(binQueue.front >= 1)

         binQueue.que[binQueue.front--] = newNode;

        

         else return 0;

         return 1;

}

 

bTree* deQueue()

{

         int t;

      if(binQueue.front != binQueue.rear){

         t = binQueue.rear;

         binQueue.rear--;

    return binQueue.que[t];

         }

         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("OVERFLOW/n");

         exit(OVERFLOW); // Allocation Error

         }

         p = *root;

         if(!p) {

                   printf("Empty Tree,build it first !/n");

             return 0;

         }

         enQueue(p); // enqueue the root of the tree

      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");

         return 1;

}

 

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

ANSWER 前面说了,最基本的是最重要的。线性数据结构是学习数据结构的入门,一定要掌握好。微软的题目还是跟国内的公司不一样。国内的一上来就是些概念,跟考历史一样。

typedef struct listNode

{

         struct listNode* link;

         int data;

}node;

 

node* getNode(node* newNode,int val)

{

    if(!newNode)

                   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

*/

int eraseNode(node*prev,node* p)

{

         if(p == NULL)

                   return 0;

         prev->link = p->link;

         free(p);

         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){

         printf("The list is empty!/n");

         return 0;

         }

         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)); // Allocate again

         q = p->link;

         }

         p->link = NULL;

      return 1;

}

 
微软面试算法题总结 Leecode 84 第一题是数字三角形找最大和路径 (容易题) 第二题是二叉树中找两个节点的最近公共祖先节点 (最近公共祖先) 给定二叉树中的特定节点中序遍历后的下一个节点 (剑指offer) Leetcode 124 最大路径和 做题 (并查集) 有n个二维平面上的点和距离d,将它们分成k组。 若两点间的距离小于等于d,则这两个点在一组;如果点A和点B在一组,点B和点C在一组,则点A和点C... 阅读详情

相关推荐

微软的100道算法面试题(终结版)

前言 数据结构与算法的重要性已不言而喻,最近,我整理出十大经典排序算法、五大常用算法总结,今天特意整理出微软面试的100题,若有不足之处,欢迎指正!由于篇幅过长,前30道题目写在上一篇,大家可以进我的个人主页浏览,之后我会抽时间争取把数据结构与算法做成一个系列,敬请期待! 31、和为n 连续正数序列 题目:输入一个正数n,输出所有和为n 连续正数序列。 例如输入15,由于1+2+3+4...

Java进阶之路 4557

计算机笔试面试题

【字符串】 1、输入一个字符串,打印出该字符串中字符的所有排列。     例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 2、有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写

bbplayers的专栏 1628

微软面试总结

微软面试总结 写在前面的话: 前两天阴差阳错,有幸参加了北京微软的实习面试,虽然被虐的很惨。 在准备面试的过程中,发现网上可以找到的面试总结还是挺少的,特别是最新日期的,所以这篇文章权当个人总结,激励自己努力,也希望能够帮助后来人。 文中内容有一部分为自己经历,一部分是准备的时候自己找的资料和联系的一些朋友提供的,仅供参考,有问题也欢迎讨论。 之前还面试过国内一些知名公司的实习岗,也拿到...

zongzi13545329的博客 1万+

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

编写反转字符串的程序,要求优化速度、优化空间。 思路 : 例如 str ="abcd"   长度是4 ,只需要进行a 与d  b 与 c交换  声明两个指针,不开辟新的空间,指针p ,s p = str ; //指向头 s= str+len-1;//指向尾节点 这样 p和 s交换 然后p++ ;s-- 这样p 和s交换 这样就可以实现字符串翻转,且 空间最小,时间复杂度为只

dahai_881222的专栏 1578

大厂笔试面试,你必须会哪些经典算法题目?

首先,强烈建议采用“题海战术”。 我今年面了数十家公司,90%的题目是原题(没办法,就那几个知识点,能有什么新题)。 题库在哪里呢? 按照循序渐进的原则,一一介绍: 1. cc150,全名cracking the coding interview - 150 Programming Questions and Solutions。 经典中的经典,曾有人别的啥都不做,刷这本书三四遍,拿了Google...

qianlia的博客 3637

奔图M6700-M6800-M7100-M7200 系列打印机拆解教程?

奔图M6700-M6800-M7100-M7200 系列打印机拆解教程?

m0_58098052的博客 1596

C字符串反转算法

一个很简洁的算法:void Reverse(char s[]){    for(int i = 0, j = strlen(s) - 1; i         char c = s[i];        s[i] = s[j];        s[j] = c;    }}#关于a, b交换其它算法:     a ^= b;    b ^= a;  

~飞 鸟 (*^__^*) 天 堂~ 1742

树莓派与OpenCV实现人脸识别(OpenCV安装篇)

主要看了以下两位博客的文章完成的,也遇到了不少的坑,在这里一一填补说明。 链接: https://blog.youkuaiyun.com/weixin_42163073/article/details/107308759. 链接: https://blog.youkuaiyun.com/weixin_42573595/article/details/108526850. 树莓派与OpenCV实现人脸识别(OpenCV安装篇)一、材料准备:二、系统烧录三、安装OpenCV依赖项四、下载OpenCV-4.3.0五、为OpenCV配置P

weixin_45880057的博客 1万+

反转字符串,优化速度,优化空间。

#include using namespace std; void reverseFixlen(char *str, int len){ char *p = str+len-1; while (str < p) { char c = *str; *str = *p; *p = c; ++str; --p; } } void reverse(char *str){

专注搜素引擎的爬取 789

【保研经验】北科自动化到北大工学院

作者:办公室某学长 谢邀。。。作为拖延症晚期患者,希望能在我科开学前写完。 先简单介绍一下我的保研过程,申请了清华叉院&amp;北大叉院大数据&amp;北大信科计算机夏令营,三者都没入营;申请了自所夏令营(自所来宣讲时未交简历,这是重大错误),给了第二批补录但没去;最终九推去了北大工学院。我的这次保研最终成功的经历可以说有一定运气成分,不具有普适性,但在前期准备过程中还是有经验可以分享的。 ...

ruanjianbu的博客 1796

TwinCAT 3 实战指南:从系统配置到高级运动控制

本文详细介绍了TwinCAT 3工业自动化控制平台的实战应用,从系统配置、PLC编程到EtherCAT总线配置和高级运动控制。通过倍福(Beckhoff)的TwinCAT 3平台,工程师可以高效实现复杂的工业自动化任务,包括运动控制、PLC编程等。文章还提供了常见问题排查和性能优化技巧,帮助用户提升系统稳定性和实时性。

weixin_30831529的博客 304

微软面试简单算法题目

sun_top的专栏 1193

PyQtWebEngine安装避坑指南:快速解决ModuleNotFoundError

本文详细解析了PyQt5开发中常见的ModuleNotFoundError: No module named 'PyQt5.QtWebEngineWidgets'错误。核心原因是PyQt5 5.11版本后,网页引擎组件被独立为PyQtWebEngine包。文章对比了退回旧版本、独立安装及使用Conda等多种解决方案,并提供了针对Windows、macOS和Linux不同平台的实战安装指南与验证方法,帮助开发者快速解决依赖问题。

weixin_29056101的博客 427

2015年5月微软(苏州)实习生面试经历

微软实习生的报名是在3月份,也是挺早的,这是我今年主要实习面试第三家公司,前两家(阿里、腾讯)可以见之前博客,第一次笔试时间在4月3号,说来奇怪,微软面试通知我去笔试的时间是在4月3号晚上6点左右,而笔试时间是在7点半,第一次没有通过,本以为微软就这样擦肩而过,后来又收到要4月24号进行第二次笔试的安排,因为我已经有了一个offer,所以也没怎么准备,最后得了200分,给了面试机会,关...

weixin_34377919的博客 325

ESP32系列之LVGL(三):Gui-Guider的使用

Gui-Guider的使用

m0_55986987的博客 2万+

基于Slim-Neck架构的YOLOv11轻量化特征融合方案(实现超轻量级与高精度的双重突破)

购买即可解锁800+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,每日更新。

m0_64661770的博客 250

新鲜出炉:微软等数据结构+算法面试100题最后20题

微软等数据结构+算法面试100题最后20题第81-100题新鲜出炉 ---100题系列V0.1版完整公布 作者:July 时间:2010年12月5日 ------------- &lt;!--EndFragment--&gt; 首先,非常感谢各位,对本微软面试100题系列前期工作的大力支持。很多很多热心的网友,积极参与进来,或在我的帖子上一起做,或对已经上传的答案,对每一题的算...

欢迎访问原优快云站点:http://blog.youkuaiyun.com/v_JULY_v 216

指纹对抗指南:如何绕过Cloudflare与Akamai的5s盾与浏览器指纹检测

现在的CDN反爬技术虽然越来越强,但是道高一尺魔高一丈,只要掌握了指纹伪造、流量伪装、行为模拟这些核心技术,就可以绕过绝大多数的防护措施。对抗过程中要注意效率和成本的平衡,小规模爬取用Playwright+stealth最方便,大规模爬取用curl_cffi+代理池性价比最高,遇到验证码用打码平台或者自动识别服务,不需要死磕破解。本文介绍的方案已经在实战中验证过,可以绕过95%以上的Cloudflare/Akamai防护,成功率非常高。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 297

微软面试题,倒置数组

View Code namespace ConsoleApplication1 { /// <summary> /// 微软面试题,一整数数组{1,2,3……} /// 选择其中某个数,然后将次数放置数组末尾, /// 比此数大的数放在数组前端递增排列 /// 在后面添加比次数小的数,递增排列 /// </su...

weixin_30349597的博客 125

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

microsoft微软——面试

 发信人: robotxu (找个好工作~~~最好工作来找我), 信区: job标 题: microsoft面试题目。发信站: 饮水思源 (2001年11月02日10:59:30 星期五), 站内信件 Algorithms* Whats the difference between a linked list and an array?* Implement an a

程序员笔试题解答 6658

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

微软 面试 心得

微软面试归来,收获了很多经验,其中包括面试的以及职业发展的,一行三天有种顿悟的感觉,希望给各位看官以启迪。 在开始下文之前,想感谢对我的博客关注的人们,继续写下去的原因是看到了一些文章数千人次的访问量,这也促使我与各位分享我成长中的点点滴滴,避免其他人走弯路。 话归正题,这次参加微软面试的机会是由学校的院长亲自筛选推荐,也很荣幸的成为了本校唯一一个推上去的人。我看了一下名单,全国大

2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

微软苏州STCA面试

一面 形式: 视频面试MicrosoftTeam,时长45min左右。 内容 英文自我介绍 讲自己最special的地方 做题:一维数组连续子数组的最小和 int Minsum(int[] arr){ if (arr == null || arr.length == 0) { return 0; } int len = arr.length; int tempsum = arr[0...

英勇的少年图 6523

“我的一次微软面试经历”

在大厂面试是中怎样的体验?作者|Ashwin Goel译者 | 弯月,责编 | 屠敏出品 | 优快云(ID:优快云news)以下为译文:大约在2-3个月前,我在Linkedin上...

优快云资讯 3395

算法面试 精选微软经典的算法面试100题(第21-25题)

算法面试 精选微软经典的算法面试100题(第21-25题)

gdfyug的博客 2385
上一篇: GOOGLE的一份面试题揭密
下一篇: 微软面试题目完全版
menuconfig
博客等级 码龄19年 713粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值