zoukankan      html  css  js  c++  java
  • 如何有效的写算法题的几个小tips

    如何有效的写算法题的几个小tips

    转自 https://www.cnblogs.com/wangdac/p/12937324.html

    刷 LeetCode 的大局观

    目前主流的刷题流派有两种,一种【龟系】,一种【兔系】。

    ”龟系“刷法的精髓就是每个题目都做干净。不满足于一种解法,各种解法都写一写。这种流派适合不太急于准备算法面试的小伙伴,追求算法的干净优雅。

    “兔系“刷法的精髓是暴力,按照标签来刷,使用固定套路来刷。比如小吴之前分析的那道拍案叫绝的算法题,如果告诉你是标签是异或,你马上能 AC 。这都是套路。

    每个标签内部可以按照 Easy 、Medium、Hard 的顺序做,算法练习是一个系统工程,不要一开始就追求难题,先熟悉熟悉套路,循序渐进的去做,后面所谓的难题也就不在话下。

    建议小伙伴第一遍刷题可以使用【兔系】法。

    看懂题目

    万事开头难,看懂题目是做好一道算法题最开始也是最重要的一步。

    我将 LeetCode 上的题大致分为三种类型:

    • 考察数据结构,比如链表、栈、队列、哈希表、图、Trie、二叉树等
    • 考察基础算法,比如深度优先、广度优先、二分查找、递归等
    • 考察基本算法思想:递归、分治、回溯搜索、贪心、动态规划等

    一些算法题目会在标题或题目描述中给出明确的题目类型信息,比如二叉树的重建、链表的反转。

    而有一些题目中则在条件中给予暗示 :

    • 设计一个 O(nlogn) 的算法(分治:在一颗搜索树中完成任务,对于数据排序)
    • 给定一个有序数组(二分法)
    • 无需考虑额外的空间(用空间换时间上的优化)
    • 数据规模大概是 10000(O(n^2)就可以)
    • 问题可以被递归解决(动态规划)

    无论怎样,当你拿到一道算法题的时候,希望你能先去弄明白这道题目要考察的是什么,是简单的数据结构还是复杂的算法思想。

    先去理清题目背后解法要用的技术,这样,这道算法题目才有做下去的可能。

    不要忽视暴力解法

    一般来说,BAT 等大厂的算法面试题基本上都是 Medium 级别及以下,并希望面试者能在 20 分钟以内给出一个「相对正确」的回答。

    为什么说是 相对正确

    每一道算法题得解法都有很多种,并不是说你没有给出完美解或者最优解你就是错的。

    “正确” 本身是一个相对概念。

    在算法面试或者平时的算法练习时,如果没有头绪,可以尝试使用暴力解法。

    (不要忽视暴力解法。暴力解法通常是思考的起点。)

    当你使用了暴力解法之后,可以与面试官进行沟通优化,把这个过程看作是和面试官一起探讨一个问题的解决方案的过程,这也可以让面试官了解你的思考问题的方式。这也是一个“正确”的回答方式。

    先实现功能再去优化。

    Done is better than perfect

    img

    实际编写

    到这一步就是算法的落地了:将上面的思考结果思路转换为代码。

    在编写的过程中需要注意题目中的边界条件,比如数组是否为空,指针是否为 NULL;同时也要注意代码的规范性:变量名,模块化,复用性。

    做好总结

    一定要做好总结,特别是当没有解出题来,没有思路的时候,一定要通过结束阶段的总结来反思犯了什么错误。解出来了也一定要总结题目的特点,题目中哪些要素是解出该题的关键。不做总结的话,花掉的时间所得到的收获通常只有 50% 左右。

    在题目完成后,要特别注意总结此题最后是归纳到哪种类型中,它在这种类型中的独特之处是什么。经过总结,这样题目才会变成你在此问题域中的积累。

    做好总结,让每道题都有最大的收获。一个月之后自己的状态应该会有很大变化。

    最后,承认刷 LeetCode 很吃力很正常

    你我都是普通的程序员,不像那些玩 ACM,拳打 LeetCode,脚踩剑指 offer,我们得接受现实:刷题,就是很痛苦很打击的过程。

    但,一遍一遍的刷,多刷一题就多掌握一题,你总会比别人更强一点。

    大家一起加油:)

  • 相关阅读:
    使用paramikoHelper类实现MySQL安装和数据恢复
    tornado-模板,转义,上传静态文件
    tornado-请求与响应
    tornado-输入
    tornado-输出,request
    配置Ubuntu虚拟环境
    tornado-简单的服务器非阻塞
    Linux查看进程,端口,访问url
    tornado-简单的服务器
    字符串,数组,定时器,form
  • 原文地址:https://www.cnblogs.com/wangdac/p/12937324.html
Copyright © 2011-2022 走看看