九章算法刷题总结

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个文件

          统计之后如果内存足够了可以直接采用快速排序,否则继续划分小文件

 

posted @ 2016-09-05 11:03  txlstars  阅读(1154)  评论(0编辑  收藏  举报