面试

LeetCode 32,并不Hard的难题,解法超级经典,带你领略动态规划的精彩

安稳与你 提交于 2021-01-15 07:02:17
本文始发于个人公众号: TechFlow ,原创不易,求个关注 <br> 今天给大家分享的是LeetCode当中的32题,这是一道Hard难度的题。也是一道经典的字符串处理问题,在接下来的文章当中,我们会详细地解读有关它的三个解法。 希望大家不要被题目上的标记吓到,虽然这题标着难度是Hard,但其实真的不难。我自信你们看完文章之后也一定会这么觉得。 <br> 链接 Longest Valid Parentheses 难度 <font color=red>Hard</font> <br> 描述 给定一个只包含左右括号的字符串,返回最长能够组成合法括号的长度 Given a string containing just the characters '(' and ')' , find the length of the longest valid (well-formed) parentheses substring. 样例 1: Input: "(()" Output: 2 ## Explanation: The longest valid parentheses substring is "()" 样例 2: Input: ")()())" Output: 4 ## Explanation: The longest valid parentheses substring is "

原创 | 2021年了,算法岗位应该怎样准备面试?

[亡魂溺海] 提交于 2021-01-15 06:58:52
点 击 上 方 蓝 字 ,关注并星标, 和 我 一 起 学 技 术 。 最近有一些小伙伴在知乎上问我,已经快要2021年了,自己想要做算法岗,但是担心竞争非常激烈,非常迷茫,不知道该怎么办,想让我给点建议。 我仔细一想,这是一个好问题,2021年将近,该怎么准备算法岗位的面试呢? 就这个问题,简单聊聊我自己的想法。 从迷茫到清晰 说到算法岗位,现在网上的第一反应可能就是内卷,算法岗位也号称是内卷最严重的岗位。针对这个问题,其实之前我也有写过相关的文章。这个岗位竞争激烈不假,但我个人觉得称作内卷有些过了。就我个人的感觉,这几年的一个大趋势是 从迷茫走向清晰 。 早在2015年我在阿里妈妈实习的时候,那个时候我觉得其实对于算法工程师这个岗位的招聘要求甚至包括工作内容其实业内是没有一个统一的标准的。可以认为包括各大公司其实对这个岗位具体的工作内容以及需要的候选人的能力要求都不太一致,不同的面试官有不同的风格,也有不同的标准。 我举几个例子,第一个例子是我当初实习面试的时候,因为是本科生,的确对机器学习这个领域了解非常非常少,可以说是几乎没有。但是我依然通过了,通过的原因也很简单,因为有acm的获奖背景,面试的过程当中主要也都是一些算法题,都还算是答得不错。但是在交叉面试的时候,一位另一个部门的总监就问我有没有这块的经验?我很明确地说了,没有,但是我愿意学。接着他告诉我

这样理解 HTTP,面试再也不用慌了~

∥☆過路亽.° 提交于 2021-01-15 06:58:04
点击上方 " 程序员小乐 "关注, 星标或置顶一起成长 后台回复“ 大礼包 ”有惊喜礼包! 关注订阅号「 程序员小乐 」,收看更多精彩内容 每日英文 When you fall down, you just gotta get back up and keep on going. There’s no sense in just sitting there. 跌倒了,就重新站起来,继续向前走;傻坐在地上是没用的。 每日掏心话 人生,需要有一些时刻,慢下来,静下来,听一听花开的声音,看一看叶子舒卷的曼妙。不要以为你放不下的人,同样会放不下你,鱼没有水会死,水没有鱼却会更清澈。 来 自 :高效运维 | 责编:乐乐 程序员小乐(ID:study_tech) 第 1089 次推文 往日回顾: Eclipse 官宣,干掉 VS Code ! 正文 1 HTTP HTTP 协议是个无状态协议,不会保存状态。 2 Post 和 Get 的区别 先引入副作用和幂等的概念。 副作用指对服务器上的资源做改变,搜索是无副作用的,注册是副作用的。 幂等指发送 M 和 N 次请求(两者不相同且都大于 1),服务器上资源的状态一致,比如注册 10 个和 11 个帐号是不幂等的,对文章进行更改 10 次和 11 次是幂等的。 在规范的应用场景上说,Get 多用于无副作用,幂等的场景,例如搜索关键字。Post

这样理解 HTTP,面试再也不用慌了~

允我心安 提交于 2021-01-15 06:57:47
点击上方“ 杰哥的IT之旅 ”,选择“ 星标 ”公众号 重磅干货,第一时间送达 1 HTTP HTTP 协议是个无状态协议,不会保存状态。 2 Post 和 Get 的区别 先引入副作用和幂等的概念。 副作用指对服务器上的资源做改变,搜索是无副作用的,注册是副作用的。 幂等指发送 M 和 N 次请求(两者不相同且都大于 1),服务器上资源的状态一致,比如注册 10 个和 11 个帐号是不幂等的,对文章进行更改 10 次和 11 次是幂等的。 在规范的应用场景上说,Get 多用于无副作用,幂等的场景,例如搜索关键字。Post 多用于副作用,不幂等的场景,例如注册。 在技术上说: Get 请求能缓存,Post 不能 Post 相对 Get 安全一点点,因为Get 请求都包含在 URL 里,且会被浏览器保存历史纪录,Post 不会,但是在抓包的情况下都是一样的。 Post 可以通过 request body来传输比 Get 更多的数据,Get 没有这个技术 URL有长度限制,会影响 Get 请求,但是这个长度限制是浏览器规定的,不是 RFC 规定的 Post 支持更多的编码类型且不对数据类型限制 3 常见状态码 2XX 成功 200 OK,表示从客户端发来的请求在服务器端被正确处理 204 No content,表示请求成功,但响应报文不含实体的主体部分 205 Reset

java面试题总结系列(多线程)

回眸只為那壹抹淺笑 提交于 2021-01-15 05:26:54
什么是进程,什么是线程? 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。 线程包含在进程当中,是进程中实际运行单位。 java实现多线程的几种方式,应该使用哪种方式比较好?   (1)继承 java.lang.Thread 类   (2)实现 java.lang.Runnable 接口   如果你要继承其他类,最好实现Runnable。 Thread类中的Start() 和run() 方法的区别? start()方法是用来启动新创建的线程,而start()内部调用的run(),如果直接调用run(),则是在原来的线程中运行的。 Runnable和Callable有什么不同? Callable的 call() 方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。 Runnable可以作为Thread构造器的参数,通过开启新的线程来执行,也可以通过线程池来执行。而Callable只能通过提交给线程池ExecutorService执行。 CountDownLatch、CyclicBarrier和Semaphore    1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:    

测试理论基础(思维导图)

不打扰是莪最后的温柔 提交于 2021-01-15 05:07:26
一、软件测试基础 二、测试级别 三、系统测试类型 四、软件测试方法 五、软件质量 六、系统测试流程 七、测试用例格式 八、用例设计方法 1.什么是软件测试? 软件测试定义:使用人工和自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。或者:为了发现程序中的错误而执行程序的过程。 软件测试存在的意义: ①程序测试为了发现程序存在的代码或业务逻辑错误; ②软件测试为了检验产品是否符合用户需求(充分站在用户的角度); ③软件测试为了提高用户的体验。 2.软件测试的原则 1、测试应该尽早介入。 2、所有的测试都应追溯到用户需求。 3、程序员应该避免检查自己的程序。除了单元测试。因为程序员对于自己的作品,思维具有局限性。无法保证测试质量。交给第三方或者专业测试,运用各种测试技术,利用丰富的测试经验和对BUG的敏感,去提高软件的质量。 4、设计测试用例时应考虑到合法的输入和不合法的输入以及各种边界条件,特殊情况下还要制造极端状态和意外状态。 5、二八原则,测试发现的错误中80%很可能起源于20%的模块中。 6、对错误结果要进行一个确认过程(分清必现和偶然)。 7、制定严格的测试计划。 8、完全测试时不可能的,测试需要终止。 9、妥善保存测试过程中所有文档。 3.软件测试的分类 按测试阶段划分:单元测试(开发的自测行为)、集成测试

深度学习面试题04:随机梯度下降法、批量梯度下降法、小批量梯度下降

我的未来我决定 提交于 2021-01-15 05:06:16
目录    一元线性回归模型    一元线性回归代价函数图像    梯度下降求解    SGD、BGD、Mini-batchGD的特点    参考资料 在《深度学习面试题03改进版梯度下降法Adagrad、RMSprop、Momentum、Adam》中讲到了多种改进的梯度下降公式。而这篇文章和03篇描述的不是一个事情,我们从一个例子说起,就知道改良的GD算法和本节介绍的GD算法的不同点了。 一元线性回归模型 举例:以房屋面积预测房屋价格 假设函数可以设置为 返回目录 一元线性回归代价函数图像 每一个预测值都与真实值存在一个差距,差距的平方和就可以作为一个代价函数。 因此代价函数为: 如下图所示(为方便观察,做了一个截断) 代码为: from matplotlib import pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) w = np.arange(-5, 8, .25 ) b = np.arange(-15, 15, .25 ) x = np.array([1,2,3,4 ]) y = np.array([3.2,4.7,7.3,8.5 ]) w, b = np.meshgrid(w, b) R = 0 for

【117期】面试官:熟悉JVM吗?为什么新生代内存需要有两个Survivor区?

大兔子大兔子 提交于 2021-01-15 02:29:54
程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 3 分钟。 来自: blog.csdn.net/antony9118/article/details/51425581 在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区? 1 为什么要有Survivor区 先不去想为什么有两个Survivor区,第一个问题是,设置Survivor区的意义在哪里? 如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC(因为Major GC一般伴随着Minor GC,也可以看做触发了Full GC)。 老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多。你也许会问,执行时间长有什么坏处?频发的Full GC消耗的时间是非常可观的,这一点会影响大型程序的执行和响应速度,更不要说某些连接会因为超时发生连接错误了。 好,那我们来想想在没有Survivor的情况下,有没有什么解决办法,可以避免上述情况: 显而易见,没有Survivor的话,上述两种解决方案都不能从根本上解决问题。 我们可以得到第一条结论:Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor

深入浅出AQS之共享锁模式

大憨熊 提交于 2021-01-15 02:28:27
搞清楚AQS独占锁的实现原理之后,再看共享锁的实现原理就会轻松很多。两种锁模式之间很多通用的地方本文只会简单说明一下,就不在赘述了 一、执行过程概述 获取锁的过程: 当线程调用acquireShared()申请获取锁资源时,如果成功,则进入临界区。 当获取锁失败时,则创建一个共享类型的节点并进入一个FIFO等待队列,然后被挂起等待唤醒。 当队列中的等待线程被唤醒以后就重新尝试获取锁资源,如果成功则 唤醒后面还在等待的共享节点并把该唤醒事件传递下去,即会依次唤醒在该节点后面的所有共享节点 ,然后进入临界区,否则继续挂起等待。 释放锁过程: 当线程调用releaseShared()进行锁资源释放时,如果释放成功,则唤醒队列中等待的节点,如果有的话。 二、源码深入分析 基于上面所说的共享锁执行流程,我们接下来看下源码实现逻辑: 首先来看下获取锁的方法acquireShared(),如下 public final void acquireShared(int arg) { //尝试获取共享锁,返回值小于0表示获取失败 if (tryAcquireShared(arg) < 0) //执行获取锁失败以后的方法 doAcquireShared(arg); } 这里tryAcquireShared()方法是留给用户去实现具体的获取锁逻辑的。关于该方法的实现有两点需要特别说明: 一

你不知道的,Java代码性能优化的 40+ 细节,赶快收藏!

余生颓废 提交于 2021-01-15 01:42:26
在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。 在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步来控制资源的并发访问; 控制实例的产生,以达到节约资源的目的; 控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。 整理了一份Java面试宝典完整版PDF 避免随意使用静态变量 当某个对象被定义为static变量所引用,那么GC通常是不会回收这个对象所占有的内存,如 public class A { private static B b = new B(); } 此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止。 避免过多过常地创建Java对象 尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度地重用对象,最好能用基本的数据类型或数组来替代对象。 使用final修饰符 带有final修饰符的类是不可派生的。在JAVA核心API中,有许多应用final的例子,例如java、lang、String