首页 > 编程知识 正文

面试算法100 题及答案,微软经典面试题

时间:2023-05-03 10:36:56 阅读:13426 作者:1206

程序员为什么要学数据结构?

在计算机发展初期,人们使用计算机的主要目的是处理数值计算问题。 使用计算机解决具体问题,首先要从具体问题中抽象出相应的数学模型,然后设计或选择求解该数学模型的算法,然后编制程序,进行调试、测试直到得到最终答案。

由于最初的对象是简单的整数型、实数型或布尔型数据,因此编程人员集中于编程技术,而不重视数据结构。 随着计算机应用领域的扩大和软硬件的发展,非数值计算问题越来越重要,统计表明,目前处理非数值计算问题占用了90%以上的机械时间。 与这种问题相关的数据结构更为复杂,数据元素之间的相互关系一般不能用数学方程描述。 因此,解决这种问题的关键是设计合适的数据结构,而不是数学分析和计算方法。

著名瑞士计算机科学家沃斯(N.Wirth )教授提出了算法的数据结构=程序

编程的本质是针对实际问题设计/选择好的数据结构和好的算法,好的算法很大程度上取决于描述实际问题的数据结构。

1、将二元搜索树改为排序的双向链表

主题:输入二元搜索树,并将二元搜索树转换为排序的双向链表。

无法创建新节点。 请只调整指针的方向。

2、设计包含min函数的堆栈

主题:定义堆栈的数据结构,要求添加能够得到堆栈最小元素的min函数。

函数min、push和pop的时间复杂度都要求为o(1)。

3、求子数组的最大和

主题:输入整形数组。 数组有正数和负数。 中连续的一个或多个整数构成子数组,每个子数组都有和。

求出所有部分数组之和的最大值。 时间的复杂性要求是o(n )。

4、在二元树中找到和值的所有路径

主题:输入整数和二元树,从树根节点向下访问,形成一个到淡淡高跟鞋经过的所有节点的路径。 打印与输入的整数相等的所有路径。

5、寻找最小的k个元素

主题:输入n个整数,输出其中最小的k个。

6、微软亚院编程判断两个链表是否交叉

主题:提出两个单向链表的头指针,如h1、h2,判断这两个链表是否相交。

为了简化问题,假设两个链表没有带环。

问题扩大:

)1)链表中可能有轮系吗?

)2)如果需要求出两个链表相交的第一个节点列?

7、判断整数序列是否是二元搜索树后的扫描结果

主题:输入整数数组,判断该数组是否为某二元搜索树的后行扫描的结果。

如果返回true,否则返回false。

8、输入按升序排序的数组和数字,查找数组中的两个数字,使其和正好与输入的数字匹配。

时间的复杂性要求是o(n )。 当多组数字之和等于输入的数字时,输出任意一对即可。

9、输入二元搜索树,将该树转换为镜像。 即,在变换后的二元搜索树中,左子树的节点都比右子树的节点大。

用递归和循环两种方法完成树的镜像转换。

10、输入一个二元树,从上到下按层次打印树的各个节点,在同一层次中从左到右依次打印。

11,n个数字(0,1,…,n-1 )形成一个圆。 每次从数字0开始,从这个圆圈中删除第m个数字(第一个是当前数字本身,第二个是当前数字的下一个数字)。 删除一个数字后,继续从已删除数字的下一个数字中删除第m个数字。

求出这个圆中剩下的最后一个数字。

12、Fibonacci数列定义如下。

/0 n=0

f(n )=1 n=1

f(n-1 ) f ) n-2 ) n=2

输入n,用最快的方法求出这个数列的n项。

分析:在许多c语言教科书中提到递归函数时,以Fibonacci为例。

13、输入表示整数的字符串,将该字符串转换为整数并输出。

例如,如果输入字符串" 345 ",则输出整数345。

14、链表操作

(1) .将单链表当场反向,

)2)合并链表

15、写函数。 其真实身份是intcontinumax(char*outputstr,char *intputstr )功能。

在字符串中找到连续的最长数字串,返回该字符串的长度,并将该最长数字串支付给函数参数outputstr中某一个指定的内存。

例如,如果将" abcd12345ed125ss123456789 "的第一个地址传递给intputstr,则函数返回9。

outputstr的值为123456789

16、跳楼问题

主题:一个楼梯共有n级。 你可以一次跳一级,也可以跳二级。

求出总共有多少总跳跃法,分析算法的时间复杂度。

17、整数二进制表示中1的个数

主题:输入整数,求出该整数的二进制表示中有几个1。

例如输入10,为了该二进制

表示为1010,有两个1,因此输出2。

分析:这是一道很基本的考查位运算的面试题.

18、栈的push、pop 序列

题目:输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序。

为了简单起见,我们假设push 序列的任意两个整数都是不相等的。

比如输入的push 序列是1、2、3、4、5,那么4、5、3、2、1 就有可能是一个pop 系列。

因为可以有如下的push 和pop 序列:

push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,

这样得到的pop 序列就是4、5、3、2、1。

但序列4、3、5、1、2 就不可能是push 序列1、2、3、4、5 的pop 序列。

19、在从1 到n 的正数中1 出现的次数

输入一个整数n,求从1 到n 这n 个整数的十进制表示中1 出现的次数。

例如输入12,从1 到12 这些整数中包含1 的数字有1,10,11 和12,1 一共出现了5 次。

分析:这是一道广为流传的google 面试题。

20、求一个矩阵中最大的二维矩阵(元素和最大).如:

1 2 0 3 4

2 3 4 5 1

1 1 5 3 0

中最大的是:

4 5

5 3

要求:(1)写出算法;(2)分析时间复杂度;(3)用C 写出关键代码

21、谷歌笔试

n 支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j 的队伍中更强的一支。所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order[n]中,比如order[n] = {4,3,5,8,1……},那么第一轮比赛就是4 对3, 5 对8。…….胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4 对5,直至出现第一名编程实现,给出二维数组w,一维数组order 和用于输出比赛名次的数组result[n],求出result。

22、有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。

23、网易有道笔试

(1)求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。

(2)求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边,有向图不再连通,描述算法。

24、百度研发笔试题

(1)设计一个栈结构,满足一下条件:min,push,pop 操作的时间复杂度为O(1)。

(2)一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短,并分析时间复杂度与空间复杂度。

(3))设计一个系统处理词语搭配问题,比如说中国和人民可以搭配,则中国人民人民中国都有效。要求:

*系统每秒的查询数量可能上千次;

*词语的数量级为10W;

*每个词至多可以与1W 个词搭配

当用户输入中国人民的时候,要求返回与这个搭配词组相关的信息。

25、递归和非递归俩种方法实现二叉树的前序遍历。

26、腾讯面试题

(1)设计一个魔方(六面)的程序。

(2)有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。

请用5 分钟时间,找出重复出现最多的前10 条。

(3)收藏了1 万条url,现在给你一条url,如何找出相似的url。(面试官不解释何为相似)

27、雅虎:

(1)对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。

(2)一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值

比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;

{3,6}{2,4,3} m=2

{3,3}{2,4}{6} m=3 所以m 的最大值为3

28、微软

一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。

29、(1)求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边

的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。

(2)求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边,有向图不再连通,描述算法。

30、和为n 连续正数序列

题目:输入一个正数n,输出所有和为n 连续正数序列。

例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3 个连续序列1-5、4-6 和7-8。

数据结构与算法的重要性已不言而喻,最近,我整理出十大经典排序算法、五大常用算法总结,今天特意整理出微软面试的100题,由于篇幅过长,将分开分享,若有不足之处,欢迎指正!很多人都会想要答案,但是我认为没有标准答案,答案表现的是个人思维,欢迎大家在评论区讨论,进行思维的碰撞。

如何学习才能快速入门并精通呢?

当真正开始学习时难免不知从何入手,从而导致效率低下影响继续学习的信心。

但最重要的是不知道需要重点掌握哪些技术,学习时频繁踩坑,最终浪费大量时间。

为了让学习变得轻松高效, 现在给大家提供一个学习平台,让你在实践中积累经验掌握原理。主要方向是JAVA架构师,在这里你可以学习Java工程化、高性能及分布式、深入浅出、性能调优、Spring,MyBatis,Netty源码分析和大数据等知识点。想要了解详情的可以加入Java后端技术群:819940388,或关注微信公众号:Java资讯库,回复“架构”,免费的大型互联网Java视频分享给大家。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。