优先级队列的实现
其实所有的排序算法都可以,重要的是时间复杂度(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)从个位开始依次与另一个大数相乘,最后将得到的所有大数依次错一格相加