labuladong 的算法小抄_关于算法笔试的几个套路,一点就透

以下文章来源于labuladong ,作者labuladong

我知道各位是被标题吸引进来的,那就不废话,先说几个算法笔试的硬核套路,再说说语言选择和做题复习的策略。

避实就虚

大家也知道,大部分笔试题目都需要你自己来处理输入数据,然后让程序打印输出。判题的底层原理是,把你程序的输出用 Linux 重定向符> 写到文件里面,然后比较你的输出和正确答案是否相同。

那么有的问题难点就变得形同虚设,我们可以偷工减料,举个简化的例子,假设题目说给你输入一串用空格分隔的字符,告诉你这代表一个单链表,请你把这个单链表翻转,并且强调,一定要把输入的数字转化成单链表之后再翻转哦!

那你怎么做?真就自己定义一个 ListNode 单链表节点类,然后再写代码把输入转化成一个单链表,然后再用让人头晕的指针操作去老老实实翻转单链表?

搞清楚我们是来 AC 题目的,不是来学习算法思维的。正确的做法是直接把输入存到数组里,然后用 双指针技巧 几行代码给它翻转了,然后打印出来完事儿。

我就见过不少这种题目,比如题目说输入的是一个单链表,让我分组翻转链表,而且还特别强调要用递归实现,就是我们旧文 K 个一组翻转链表 的算法。嗯,如果用数组进行翻转,两分钟就写出来了,嘿嘿。

还有我们前文 扁平化嵌套列表 讲到的题目,思路很巧妙,但是在笔试中遇到时,输入是一个形如 [1,[4,[6]]] 的字符串,那直接用正则表达式把数字抽出来,就是一个扁平化的列表了……

巧用随机数

再说一个鸡贼的技巧,注意那些输出为「二值」的题目,二值就是类似布尔值,或者 0 和 1 这种组合有限的。

比如说很多题目都类似这样,巴拉巴拉给你说一堆条件,然后问你输入的数据能不能达成这些条件,如果能的话请输出 YES,不能的话输出NO。

如果你会做当然好,如果不会做怎么办?

首先这样提交一下:

public class Main {    public static void main(String[] args) {        System.out.println("YES");    }}

看下 case 通过率,假设是 60%,那么说明结果为 YES 有 60% 的概率,所以可以这样写代码:

public class Main {    public static void main(String[] args) {        // 60% 的概率输出 YES,40% 的概率输出 NO        System.out.println((new Random().nextInt() % 100) < 60 ? "YES" : "NO");    }}

多提交几次,整出个 80% 以上的 case 通过不是问题。

嘿嘿,labuladong 说了,这题你可以不会,但是一定要在力所能及的范围内做到极致!

概率大师

说一个场景,如果笔试出现那种恶心人的单选,四个选项全都没见过,然后你蒙了一个 C。

假设,过了一会你突然灵光一闪,唤起一些零碎的记忆,确定 B 选项是错的,那么,这时候你该怎么做?

重新在 A 和 D 中间蒙一个啊哥哥!不重新蒙,正确的概率是 1/4,重新蒙,正确的概率是 3/8,白捡的概率都不要么?

是不是觉得不可思议?是不是觉得我在胡扯?

这样,假设一道选择题有 100 个选项,你随便蒙一个,正确率为 1%,错误率为 99%。

假设现在 labuladong 显灵,帮你在剩下的 99 个选项中排除了 98 个错误选项,只剩下一个选项,然后问你,你继续坚持原来的选择,还是换成帮你排除剩下的那个选项?

换啊!换了之后正确概率是 1 - 1% = 99% 啊!

那如果 labuladong 只帮你排除了 90 个错误选项,剩下 9 个选项,那你要不要换成这 9 个选项中的某一个?

换啊!换了之后正确概率是 (1 - 1%) / 9 = 11% 啊!

那回过来看,四个选项,你开始蒙了一个,后来灵光一闪在剩下三个选项中排除了一个错误答案,那你换不换?

换啊!换了之后正确概率是 (1 - 1/4) / 2 = 3/8 啊!

其实这就是典型的「三门问题」

编程语言的选择

仅从做算法题的角度来说,我个人比较建议使用 Java 作为笔试的编程语言。因为 JetBrain 家的 IntelliJ 实在是太香了,相比其他语言的编辑器,不仅有 psvm 和 sout 这样的命令缩写(你要是还不知道命令缩写,赶紧面壁去),而且可以帮你检查出很多笔误,比如说 while 循环里面忘记递增变量,或者 return 语句错写到循环里这种由于疏忽所导致的问题。

C++ 也还行,但是我觉得没有 Java 好用。我印象中 C++ 连个分割字符串的 split 函数都没有,光这点我就不想用 C++ 了……

还有一点,C++ 代码对时间的限制苛刻,别的语言时间限制 4000ms,C++ 限制 2000ms,我觉得挺吃亏的。怪不得看别人用 C++ 写算法,为了提高速度,都不用标准库的 vector 容器,非要用原始的 int[] 数组,我看着都头疼。

Python 的话我刷题用的比较少,因为我不太喜欢用动态语言,不好调试。不过这个语言的奇技淫巧太多,如果你深谙 Python 的套路,可以在某些时候投机取巧。比如说我们前文写到的 表达式求值算法 是一个困难级别的算法,但如果用 Python 内置的 exec 函数,直接就能算出答案。

这个在笔试里肯定是很占便宜的,因为之前说了,我们要的是结果,没人在乎你是怎么得到结果的。

解法代码分层

代码分层应该算是一种比较好的习惯,可以增加写代码的速度和降低调试的难度。

简单说就是,不要把所有代码都写在 main 函数里面,我一直使用的套路是,main 函数负责接收数据,加一个 solution 函数负责统一处理数据和输出答案,然后再用诸如 backtrack 这样一个函数处理具体的算法逻辑。

举个例子,比如说一道题,我决定用带备忘录的动态规划求解,代码的大致结构是这样:

public class Main {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        // 主要负责接收数据        int N = scanner.nextInt();        int[][] orders = new int[N][2];        for (int i = 0; i < N; i++) {            orders[i][0] = scanner.nextInt();            orders[i][1] = scanner.nextInt();        }        // 委托 solution 进行求解        solution(orders);    }    static void solution(int[][] orders) {        // 排除一些基本的边界情况        if (orders.length == 0) {            System.out.println("None");            return;        }        // 委托 dp 函数执行具体的算法逻辑        int res = dp(orders, 0);        // 负责输出结果        System.out.println(res);    }    // 备忘录    static HashMap memo = new HashMap<>();    static int dp(int[][] orders, int start) {        // 具体的算法逻辑    }}

你看这样分层是不是很清楚,每个函数都有自己主要负责的任务,如果哪里出了问题,你也容易 debug。

倒不是说要把代码写得多规范,至于 private 这种约束免了也无妨,变量用拼音命名也 OK,关键是别把代码直接全写到 main 函数里面,真的乱,不出错也罢,一旦出错,估计要花一番功夫调试了,找不到问题乱了阵脚,那是要尽量避免的。

考前复习策略

考前就别和某一道算法题死磕了,不划算。

应该尽可能多的看各种各样的题目,思考五分钟,想不出来解法的话直接看别人的答案。看懂思路就行了,甚至自己写一遍都没必要,因为比较浪费时间。

笔试的时候最怕的是没思路,所以把各种题型都过目一下,起码心里不会慌,只要有思路,平均一道题二三十分钟搞定还是不难的。

前面不是说了么,没有什么问题是暴力穷举解决不了的,直接用 回溯算法套路框架 硬上,大不了加个备忘录,不就成 动态规划套路框架 了么,再大不了这题我不做了么,暴力过上 60% 的 case 也挺 OK 的。

别的不多说了,套路这个东西,说来简单,一点就透,但问题是不点就不透。本文我简单介绍了几个笔试算法的技巧,各位好好品味~

算法真的没那么难,这一切只是手段而已,过算法笔试拿 offer 才是目的。为了达到目的,套路是必须的,《labuladong的算法小抄》将会为你提供这方面的帮助,可以少走很多弯路!

cc31b7e7855d2184d3e9f1370d6bb668.png

▊《labuladong的算法小抄》

付东来(@labuladong) 著

  • GitHub 68.8k star的硬核算法教程
  • labuladong带你挑战力扣算法题
  • 挑战BAT等大厂Offer

本书专攻算法刷题,训练算法思维,应对算法笔试。注重用套路和框架思维解决问题,以不变应万变。

0133f6264250462f5785a6f18653fa70.gif
d1e1b5455512d12f376b7cbf9ed74b0c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TVP两周年:携手同行,让未来可见

TVP两周年2018年12月15日&#xff0c;在北京的腾讯云社区开发者大会上&#xff0c;作为腾讯云构建开发者生态的重要战略&#xff0c;TVP计划正式发布。2020年12月15日&#xff0c;不知不觉&#xff0c;腾讯云TVP已经走过了两度春秋。从0到1的探索&#xff0c;1到10的成长&#…

加密封装 怎么把_不要再封装各种Util工具类了,这个神级框架值得拥有!

Hutool 谐音 “糊涂”&#xff0c;寓意追求 “万事都作糊涂观&#xff0c;无所谓失&#xff0c;无所谓得” 的境界。Hutool 是一个 Java 工具包&#xff0c;也只是一个工具包&#xff0c;它帮助我们简化每一行代码&#xff0c;减少每一个方法&#xff0c;让 Java 语言也可以 “…

Oh my God, Swagger API文档竟然可以这样写?

最好的总会在不经意间出现。“作为后端程序员&#xff0c;免不了与前端同事对接API&#xff0c; 一个书写良好的API设计文档可有效提高与前端对接的效率。为避免联调时来回撕逼&#xff0c;今天我们聊一聊正确编写Swaager API文档的姿势。基础Swagger用法在ConfigureServices配…

vue 前端设置允许跨域_web 前端的一些小问题

关于vue使用axios post发送json数据跨域请求403的解决方法&#xff1a;1. 问题vue开发的时候&#xff0c;使用axios跨域发送请求&#xff0c;同时post发送的数据格式是json格式&#xff0c;发送出去的时候发现控制台报错403&#xff0c;返回的信息提示是跨域的问题&#xff0c;…

如何在 Windows 10 上安装 WSL 2

翻译自 Joey Sneddon 2020年10月30日的文章《How to Install WSL 2 on Windows 10》 [1]如果您想在最新的 Windows 版本中尝试经过改进的 Windows 子系统 Linux 2 (即 WSL 2) [2]&#xff0c;要怎么做呢&#xff1f;我们在本文中介绍了安装它所需要做的所有事情。WSL 2 是微软早…

lnmp无法远程连接mysql_MySQL(一):设置root 可以远程连接MySQL

在mysql在远程主机或虚拟机上时&#xff0c;远程连接mysql数据库一般都使用GUI工具&#xff0c;比如Mac下的Sequel Pro&#xff1b;win和linux下的Sqlyog&#xff1b; 还有大名鼎鼎的Navicat。有人也许会说命令行多好&#xff0c;对着黑黑的屏幕噼里啪啦的一顿敲&#xff0c;屏…

云付认证已通过可以支付吗_海科融通丨刷新支付日常问题【附交易操作步奏】...

01常见问题汇总QPIN秘钥检验出错A&#xff1a;认证时不要频繁点击&#xff0c;点完后等一等系统反应&#xff0c;可联系客服处理。Q报错99&#xff0c;该小商户已入网A&#xff1a;提供商户编号给服务经理处理。Q终端屏幕无法签字A&#xff1a;待机界面&#xff0c;输入#0#&…

邀请函|WorkShop报名通道开启,来就送礼!

作为互联网行业的年度盛会今年除延续以往的开幕与论坛技术分享外还增设了Work Shop 体验课程&#xff01;参加此次工作坊不仅能近距离和大佬进行互动体验项目开发的快感还能领取大会纪念卫衣、书籍等惊喜好礼是不是很期待&#xff1f;&#xff08;数量有限先到场先得&#xff0…

对象数组参数_【JavaScript 教程】标准库—Array 对象

作者 | 阮一峰1、构造函数Array是 JavaScript 的原生对象&#xff0c;同时也是一个构造函数&#xff0c;可以用它生成新的数组。var arr new Array(2);arr.length // 2arr // [ empty x 2 ]上面代码中&#xff0c;Array构造函数的参数2&#xff0c;表示生成一个两个成员的数组…

机器学习之无监督学习——聚类

机器学习之无监督学习——聚类无监督学习一、基于划分的聚类方法1、基于划分的方法 简介A、概念B、分组C、分组与样本 对应关系D、硬聚类 与 软聚类二、基于层次的聚类方法1、基于层次的聚类方法 概念 :2、基于层次的聚类方法 :A、聚合层次聚类 ( 叶子节点到根节点 )聚合层次聚…

2020 . NET大会日程公布!行程亮点全曝光

|倒计时5天文末有福利答应我看到最后|2020年12月19日由.NET众多社区联合组织主办的2020年中国.NET开发者大会将于苏州盛大开幕时间&#xff1a;2020/12/19-12/20主题&#xff1a;开源、共享、创新地点&#xff1a;苏州人工智能产业园▽本次大会以“开源、共享、创新”为主题&am…

橡皮擦_日本推出改邪归正橡皮擦,看得我头顶一凉

▲▲▲点击查看▲▲▲日本&#xff0c;可以说是文具控的天堂。各种不按套路出牌&#xff0c;又十分合理有趣的文具&#xff0c;真是太多太多。就比如这块「改邪归正橡皮擦」&#xff1a;这么看&#xff0c;你可能看不出到底怎么个改邪归正法&#xff0c;但其实它的创作灵感来自…

三菱四节传送带控制梯形图_一文讲透FX5U PLC程序控制指令及步进梯形图编程

三菱PLC在80年代进入中国市场&#xff0c;已有30多年历史。由于三菱PLC编程易学&#xff0c;功能强大&#xff0c;深受中国用户喜爱。随着时间推移&#xff0c;市场上已经淘汰掉二代产品&#xff0c;关系图如下&#xff1a;说明90年代老型号2000年代老型号低端小型机FX0SFX1S中…

在 ASP.NET Core 中使用多种方式给 Action 传参

ASP.NET Core 是一个跨平台&#xff0c;开源的&#xff0c;轻量级&#xff0c;高性能 并且 高度模块化的web框架。在 ASP.NET Core MVC 中有很多种方式可以给 Action 方法传递参数&#xff0c;比如说&#xff1a;url方式&#xff0c;querystring方式&#xff0c;request header…

WinUI 3 Preview 3 发布了,再一次试试它的性能

1. WinUI 3在微软 Build 2020 开发者大会上&#xff0c;WinUI 团队宣布可公开预览的 WinUI 3 Preview 1&#xff0c;它让开发人员可以在 Win32 中使用 WinUI。最终 XAML 的新功能不再和 Windows SDK 绑定&#xff0c;所有新的 XAML 功能都将作为 WinUI 的一部分发布。作为 OS 的…

m苹果放n篮子_egg appple千万别翻译为“鸡蛋苹果”,老外听到会懵圈的

egg很熟悉&#xff0c;apple也很熟悉&#xff0c;可是egg apple就让人一脸懵了&#xff0c;鸡蛋苹果是啥玩意&#xff1f;难道中国人有番茄鸡蛋&#xff0c;而歪果仁喜欢鸡蛋炒苹果&#xff1f;1&#xff1a;egg apple 是什么意思&#xff1f;其实英国人眼中的茄子是 egg apple…

基于.NET Core的简单,跨平台,模块化的电子商务系统-SimplCommerce

SimplCommerce是基于.NET Core的简单&#xff0c;跨平台&#xff0c;模块化的电子商务系统官网&#xff1a;www.simplcommerce.com开源地址&#xff1a;https://github.com/simplcommerce/SimplCommerce高层架构在线演示&#xff08;Azure网站&#xff09;店面&#xff1a;http…

grade项目导入新external libraries_【易推荐】德意志银行学院中国项目启动

展翅高飞 开阔眼界探索新的机遇总会令人振奋不已。德意志银行集团(以下简称德意志银行或德银)举办了“德意志银行学院”项目(DB Academy&#xff0c;以下简称“德银学院”)。如果同学们有投身金融服务行业的志向&#xff0c;欢迎加入德银学院在中国的项目。“德银学院”项目为…

程序员过关斩将--请不要误会redis 6.0 的多线程

“你对redis的单线程是不是有点误会&#xff1f;“你对redis 6.0的多线程是不是也有点误会&#xff1f;“redis多线程一定可以提高性能吗&#xff1f;redis官方刚刚发布的6.0版本已经掀起了业界一阵热波&#xff0c;在这个版本中新加了很多新特性&#xff0c;如果你打开redis的…

python 防止转义_python字符串前加r、f、u、l 的区别

f-strings 是指以f或F 开头的字符串&#xff0c;其中以 {}包含的表达式会进行值替换。&#xff08;目前支持python3.6版本&#xff09;下面看下f-strings的使用方法基本使用&#xff08;作用&#xff1a;替换值&#xff09;在字符串前加r可防止字符串转义作用&#xff1a;没有转…