九章算法刷题总结
1、实现一个memcpy函数:memcpy(void *p, void *q, unsigned len);
思路:1、注意p、q是否为NULL
2、内存重叠的情况
3、每次copy字节数:32系统可以选择4字节如int,64系统可以选择8字节如long long
2、STL中vector的实现原理
vector本质其实就是一个动态内存分配的数组,内存分配策略(元素个数):
0->1->2->4->8->16->...
相关方法:可以通过capacity函数获取当前可以容纳的元素个数
通过shrink_to_fit函数可以紧缩内存,把多余的空闲内存收回(C++11支持)
3、给定N张扑克牌和一个随机函数,设计一个洗牌算法
问题转化:相当于设计一个函数可以随机1~54中的所有数,每个数仅出现一次且概率相等
思路:1、开一个大小为len的数组ary,数组的元素值与下标相同
2、index = random(0, len - 1),本次随机到的值是ary[index];
3、交换ary[index] 与 ary[len - 1]的值, 然后len--
4、进入下次随机
4、25匹马,5个跑道,每个跑道最多能有5匹马进行比赛,最少比多少次能比出前3名?前5名?
思路:1、首先将25匹马分为5组,每次进行一次比赛
2、把每组的第一名拿出来进行一次比赛(决出第一名)
3、第一名所在组:取出其第2、3名
第二名所在组:取出其第1、2名
第三名所在组:取出其第1名
进行一次比赛,其中的第1、2名分别为第二名和第3名
总共7次(5名的大家推一下就OK)
5、100亿个整数,内存足够,如何找到中位数?内存不足,如何找到中位数?
思路:内存足够的情况下:
快速排序算法或者二分法统计都可以
内存不足的情况下:
1、二分法(对于32的int最多32次)就行了
2、hash分到小文件中:hash函数(可以取32位中的前10作为hash值)划分成1024个文件
统计之后如果内存足够了可以直接采用快速排序,否则继续划分小文件