1. 什么是基于比较的排序?快速排序、合并、冒泡、插入、堆、【希尔、选择】
a) 选择排序:这应该是最直观的排序方法。对n个元素进行排序时,第一次遍历找到最小的元素,与第一个元素交换;第二次遍历找到下一个最小元素并将其与第二个元素交换;直到剩下最后一个元素。
b) 冒泡排序:这应该是我们学习的第一个排序算法。基本思想是按顺序比较两个相邻元素。如果后一个值小于前一个值,则交换两个值。小的值交换到前面,大的值交换到后面。这样遍历完后,将最大值放在最后。小值在n-1之前交换。然后再遍历前n-1、n-2,直到最后2个元素。整个过程中,小值随着不断的遍历过程逐渐交换到前面,很像水底逐渐冒出的气泡。所以称为冒泡算法。
c) 插入排序:这个算法的思想非常直观。根据《算法导论》中的解释,这个算法可以参考我们平时打扑克的情况。抽牌时,按顺序比较手中的牌,插入到适当的位置。这可以确保你手中的所有牌仍然按顺序排列。当排序后的值较多时,由于保证了顺序,因此在确定新值的插入位置时,可以通过二分查找的方式来确定插入位置。
d) 希尔排序:在冒泡算法中,小值只能以步长1前进。希尔排序优化步长,以较大的步长m开始分组,并对每组进行插入排序,从而实现步长为m的移动。然后逐渐减小步长m,直到为1。所以基本思想是将元素移动得尽可能远,而不是移动一个位置。
e) 归并排序:这个思想采用了解决问题的一个常见思想,divide-and-conquer,即分而治之的思想。将n个元素一次分成2组,变成两个n/2元素组,直到有1个元素,——1个元素,自然排序。然后将元素组两两合并,最后合并为一个元素组。合并算法,因为需要合并,所以必须需要额外的n空间来实现合并。
f) 快速排序:同样采用分而治之的思想,将原始数据分为2组。然而,与直接将原始数据分为两部分的合并算法不同,快速排序选择一个中值并创建两个新的子组。一个子组的所有元素都小于中值,而另一子组的所有元素都大于或等于中值。直到元素个数为1时的中值。当元素个数为1时,快速排序实际上已经完成了排序。这也与归并排序不同。快速排序在子组完成后不需要进行额外的操作。显然,快速排序的效率取决于中位数的选择。如果中位数可以将数据分为两个相等的子组,则它是最有效的。快速排序不需要额外的存储空间,可以就地排序。
g) 堆排序:其思想是将原始元素视为平衡二叉树。然后按照父节点必须大于子节点的规则调整平衡二叉树。由于它是平衡二叉树,因此数据被完美地划分为相等的部分。这样根节点就是最大值。此时堆排序就完成了最大值的选择。要排序,请将根节点与最后一个子节点交换。这时树的规则就被破坏了,规则需要从根节点开始逐步验证。
2.不基于比较的排序:计数排序
a) 计数排序使用额外的数组C,其中第i个元素是要排序的数组A中值小于或等于i的元素的个数。然后根据数组C将A中的元素排列到正确的位置。
3.描述归并和快速排序的基本思想是什么?堆排序的原理是什么?如何对堆进行就地排序?
4.图搜索有哪两种类型?他们依靠什么数据结构来实现这一目标?
a) BFS:通过队列[先进先出]实现,每次将搜索节点未访问过的相邻节点添加到队列末尾。初始状态将起始节点放入队列中。迭代队列中的点,直到队列为空。
b) DFS:通过栈【先进后出】来实现。每次将搜索到的节点压入栈时,都会访问其未访问的相邻点之一[压入栈],并将起始节点以初始状态压入栈。栈为空,DFS遍历结束。
5、树知识点没有考,但是遇到一个从天津来面试的朋友,考的是二叉搜索树题。
a) 给定区间[a, b],从一棵二叉搜索树中找出该区间内的数[考察二叉搜索树的遍历,有些分支是不需要遍历的,因为二叉搜索树本身有一定的大小关系];
b) 有两棵二叉搜索树,求两棵二叉搜索树中的公共数字【暴力法,遍历一棵树中的数字并在另一棵树中搜索】。
6.动态规划(手写代码)题:
a) n 写为多个数字的平方和。求最小的平方和。例如,n=5,则答案为2。
b) 可以记忆中间结果(更优化的方法尚未解答)。
c) 问我如何构造一个测试用例(负数、0、1、大数)。
附代码:n的根号需要四舍五入,i的平方为i*i,i^2为OR运算
7、面试官问了几个问题,答案总结如下:
a) 做你喜欢做的事
b) 微软灵活的工作时间很棒。
(2) 两侧
1. 关于您简历中的项目实习经历,您最近项目中最有收获的部分是什么?
2.动态规划(手写代码)题:
a) 网格从起始位置(1,1) 到(m,n) 位置的所有可能的移动。
b) 如果在这个m*n中的某些网格上添加障碍物怎么办?
c) 动态规划不需要递归编写
附代码:
3. TCP相关问题:TCP数据包发送可能需要等待回复。如何优化这个数据包发送过程?
a) 滑动窗口协议,设置窗口大小,接收多个数据包,只回复最后一个数据包的ack。
4、面试官建议你下次面试时带上自己的纸质简历,多做准备【基本算法+快速思维能力】。建议不要全局使用Python变量。
(3) 三边
1、自我介绍一下,说说一个比较好的项目。
2、查询字符串list_query,输入多个标题的字符串list_title,统计每个list_title中list_query的数量。
a) 为list_query创建哈希表(python-dict(key, value))
深入解析微软软件开发工程师面试要点与策略和的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!
【深入解析微软软件开发工程师面试要点与策略】相关文章:
用户评论
刚看到这个标题,想问问里面具体会讲哪些软件开发方面的知识啊,比如算法、数据结构还是框架技术
有20位网友表示赞同!
做微软软件工程师真的很难吗?准备好久才敢去面试,希望可以顺利过关。
有8位网友表示赞同!
面试经验分享真的很宝贵!希望能看到一些实际的操作技巧,这样在下一次面试的时候可以更有经验点
有18位网友表示赞同!
我感觉微软的研发环境应该很棒吧?听说薪资待遇也很优厚
有13位网友表示赞同!
想问问具体的岗位类型是什么?比如是前端、后端还是全栈开发?
有11位网友表示赞同!
微软的面试流程通常是怎么样的?是技术笔试然后电话面试,最后HR面试吗?
有18位网友表示赞同!
做软件工程师确实需要不断学习新技术,想要跟上微软的技术节奏才行
有6位网友表示赞同!
听说微软的团队文化很注重合作,是不是这样?
有7位网友表示赞同!
最近一直在刷leetcode算法题,准备这个面试考试还是有点紧张
有19位网友表示赞同!
希望这篇文章能提供一些关于软件开发工程师应聘技巧的建议,比如如何突出自己的优势
有17位网友表示赞同!
微软的大公司肯定有很多项目要负责,工作量不会太小吧?
有19位网友表示赞同!
想问问作者在微软的工作经历和感受是什么样的?
有11位网友表示赞同!
这篇文章能给我一些关于软件开发工程师未来的发展方向的启示吗?
有17位网友表示赞同!
做软件工程师需要强大的沟通能力,才能高效地与团队合作解决问题
有18位网友表示赞同!
好奇微软公司的其他福利有哪些?除了薪酬待遇
有18位网友表示赞同!
想了解更多关于微软公司内部的技术氛围和工作文化
有18位网友表示赞同!
最近开始学习编程,看到这个标题就觉得很有意义,希望能够积累一些职场经验
有5位网友表示赞同!
这篇文章能让我更好地了解微软软件开发工程师的需求吗?
有19位网友表示赞同!