MicroSoft:面试题收集与解题思路

优先级队列的实现

其实所有的排序算法都可以,重要的是时间复杂度(TC)
Java用的是堆排序,这样每次输出一个堆顶就可以了,不用对数据全部排序

Init 堆的 TC = O( N )
Poll 输出最大/最小的 TC = O( lgN )
Delete 的 TC = O( 1 )

求整型数组的最大连乘积,并输出下标i,j

维护两个数组:
max[k]:表示以 k 为连乘的尾巴的最大乘积
min[k]: 表示以 k 为连乘的尾巴的最小乘积
遍历数组 arr[],则以 i 为连积尾巴的最大乘积为 max[i]、最小乘积 min[i],分别为 max[i-1]*arr[i]、min[i-1]*arr[i]、arr[i] 中的最大值和最小值
过程中记录 max 值,并更新最大值得的首位 index:i,j 即可

求连通区域个数的矩阵题:一个n*n矩阵,里面的元素都是1或者0,0表示不通,1表示通,四向连通的1构成连通区域, 求矩阵里的连通区域和最大连通区域中元素1个个数。

DFS,遍历点,遇到 1 就开始DFS,将遍历过的全部置为0,一次DFS完成就是一个连通区域

给一系列CPP文件,每个文件都包含若干个INCLUDE (可能是0个),现在给你一个目标文件,求所有合法的编译顺序。

拓扑排序

数组中第K大的数

快排

1G内存,给10亿个整数排序

1G 内存中采用堆排序,建设1G能够放 K 个整数,则维护堆个数K个不变,每次新的数据进来,如果比顶部小,则换出顶部,调整堆
最后堆里面的就是10亿个数中的 K 个最小,输出后就是有序的 K 个,存起来,继续排其他的,最后串起来

找出数组的Majority

给定一个数组A[n], 定义数组的主元素 ( Majority Element) 为数组中出现次数超过 n/2 的元素。设计一个高效的算法来寻找数组的主元素。

将Majority数当做1,其他不同数当做-1,
遍历数组,设置 Majority = arr[0]
遇见不同的数就 -1
遇见相同的数就 +1
直到和为0, 重置为当前值 Majority = arr[i]
最后得到的Majority 必然是主元素

参考文章:http://www.cnblogs.com/python27/p/4354773.html

要设计一个中文计算器,要求:给1-9对应的数字键以及退格键,要求每次按键按下,屏幕上正确显示阿拉伯数字和对应的中文大写

实际上就是实现将整形转换成对应的中文表示
(1)当前数字的合法转换:例如0001,需要转化成1,然后输出对应的中文表示
(2)将各个数字对应的中文存Hash,Key为数字,Value为对应中文例如987775
(3)将十、百、千、万等存另外Hash
(4)直接根据位数和对应的数字,从个位开始转,然后将转换的中文存栈,打印出来的就是
(5)对于像10010,10000这样的数要特殊处理

实现一个大数乘法

(1)关键就是对于进位的记录
(2)从个位开始依次与另一个大数相乘,最后将得到的所有大数依次错一格相加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值