最简单的cms网站怎么做,关键词优化排名易下拉霸屏,wordpress字体加载,拼多多一件代发货源app以下文章来源于labuladong #xff0c;作者labuladong我知道各位是被标题吸引进来的#xff0c;那就不废话#xff0c;先说几个算法笔试的硬核套路#xff0c;再说说语言选择和做题复习的策略。避实就虚大家也知道#xff0c;大部分笔试题目都需要你自己来处理输入数据作者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% 的概率输出 YES40% 的概率输出 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 代码对时间的限制苛刻别的语言时间限制 4000msC 限制 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的算法小抄》将会为你提供这方面的帮助可以少走很多弯路▊《labuladong的算法小抄》付东来(labuladong) 著GitHub 68.8k star的硬核算法教程labuladong带你挑战力扣算法题挑战BAT等大厂Offer本书专攻算法刷题训练算法思维应对算法笔试。注重用套路和框架思维解决问题以不变应万变。