阿龙的学习笔记---《程序员面试金典》笔记 --- 各类型题目要点

  • 1. 数组与字符串

    • 提到了散列表(哈希表)和动态数组,做题时可能要想到用散列表。
    • 字符串使用哈希表可以采用一个256字节的数组来实现,因为ASCII只有0~256。
    • 双指针要会用,好用。
    • 数组和字符串,由于在中间删除插入等会导致后面的都变动,所以最好能从尾部开始调整。

  • 1. 链表

    • 链表在做题时搞清楚是单向链表、还是双向链表、还是循环链表等。
    • 链表的访问用时不定,不是O(1)所以比较麻烦,而且有时会用到递归。
    • 删除、插入等操作时,一定要记得判断是否为链表头或者!这部分的操作会不同。
    • 快慢指针是链表操作的一个小技巧,做题时记得考虑。
    • 解不出时不妨试试递归
    • 快慢指针找出环路的算法可以再复习一下,很巧妙!

  • 3. 栈与队列

    • 概念理解好了,其他就靠脑子了,一些题中要能想到要用到栈或者队列,这要对二者的特性拿捏的比较好。

  • 4. 树与图

    • 二者是非线性的数据结构,在一些算法中,最好情况最坏情况可能会有较大差距,注意这点。
    • 二叉树的题目中,要注意是不是一些特殊的树结构,对特殊的树结构要了如指掌,比如二叉搜索树、二叉平衡树,对高阶的红黑树、B树、B+树、trie树(单词查找树)等也要有所了解。
    • 树的遍历:前中后序遍历,递归很好写,迭代不太会写,可以学学。BFS的层次遍历写过多次了。
    • 图的遍历DFS和BFS两种。DFS主要以递归实现,注意要对访问过的节点标记。BFS主要以队列的形式。一般BFS利于解决最短路径的问题!
    • 二叉搜索树有个地方比较模糊:书上说左子树小于等于,右子树大于;百度百科说左子树小于等于,右子树大于等于。这个要确定好。某些地方可能会出问题。

  • 5. 位操作

    • 对各种二进制操作都了解,清零用 (x & 0),置位用 (x | 1),取反用 (x ^ 1)。
    • (n & (n-1))将最后一个1清除为0。
    • 都较为巧妙,靠脑子吧。

  • 6. 智力题

    • 总结规律,靠脑子吧。

  • 7. 数学题

    • 靠脑子 x 3。

  • 8. 面对对象设计

    • 处理不明确的地方;
    • 定义核心对象;
    • 分析对象关系;
    • 研究对象动作。

  • 9. 递归和动态规划

    • 这类型题首先要能看出来是递归,那么在递归中加上结果缓存既是动态规划,在结果需要多次调用时,能够大大节省时间。
    • 还没做那个专题,之后加油!

  • 10.拓展性与存储限制

    • 循序渐进

      • 首先假设如果一台计算机中能够装下所有,那么你如何解决?这个思路会为之后提供帮助。
      • 接着考虑如何合理拆分数据?计算机从哪里去读取?
      • 最后,针对步骤二中的问题给出解决办法,可能在解决时又会出现新的问题,那么需要一步步解决。有可能用步骤一中的方法进行改进,也可能推翻重新找到巧妙的方法。
    • 在考虑这样的问题的之前,最好了解计算机一般的存储容量、内存大小、网络延迟是多少。

    • 拆分数据

      • 按照顺序:一台机器塞满了,塞进下一台机器;
      • 按照散列表:以散列表将数据分布至多台机器,但可能负载不均匀;
      • 按数据实际值:比如社交系统,中国的放在一起,墨西哥的放在一起,这样在这种场合下,访问效率较高;
      • 随机: 随机放在不同机器,虽然均衡了,但是查找表肯定会巨大。
    • 考虑使用散列表来解决问题。

    • 内存不够用时,考虑将每个字节拆分成8个bit,有些情况就够用了。

    • 例1:40亿个非负整数,找出一个没出现过的,内存有1GB(拓展1MB 内存)。

      • 1GB是10亿字节,如果拆为bit,则为80亿bit,40亿个数够放下了。所以拿出前40亿bit,如果出现了置1。然后找到一个为0的即可。
      • 1MB是100万字节,上面的方法肯定是不行的。这时则要思考了。100万字节最多表示800万的数,我们拿出100万用。我们只要找到某100万区间内,哪个区间的数不够100万个,然后再用上面的方法即可找到这个区间内没有的数字。
      • 40亿共有4000个100万,第一遍循环,统计4000个区间内的数字数目,找到不够100万的。然后再这个区间内找。
    • 例2:给100亿个网站URL,找出其中重复的URL。

      • 首先,假设一个网站100字符,一个字符4字节。400字节,那么100亿就是4TB的总量。内存肯定放不下。
      • 但首先假设能放下,我们怎么找出重复的呢?遍历,建立哈希表,找出重复的。
      • 那么我们需要将数据分散,那么以什么方式呢?顺序、哈希、随机?都可以。我们将4TB分为4000份,放在硬盘中,每份1GB,然后对这1GB进行查找重复值。

  • 11. 排序与查找

    • 各种排序算法要熟悉,以及其性质。
    • 二分查找、快速排序肯定是重点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值