每周至少做一个Leetcode算法题
题目来源:左程云、《程序员代码面试指南:IT名企算法与数据结构题目最优解(第2版)》由两个栈组成的队列
【题目】编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)。
【解答】队列的特点是先进先出,栈的特点是后进先出。为满足题目要求,假设第一个栈为stackPush,进入队列的数据压入栈stackPush。第二个栈为stackPop,负责数据出队列。可以将stackPush全部数据逐一弹出并压入stackPop栈,假如stackPush栈从栈顶到栈底依次是5~1,那么经过搬运后,stackPop栈从栈顶到栈底依次为1~5,队列add值压入stackPush栈,poll的值从stackPop弹出,peek为stackPop的栈顶元素。很多人以为这很简单,其实需要搬运需要满足两个条件。
破坏这两个条件中任意一个都会导致任务失败,由两个栈组成的队列做了详细分析。
何时进行数据的搬运呢?poll和peek中必须执行数据搬运,否则不能保证数据的刷新,add中不要求。
参考代码如下:
public class A11_TwoStackToQueue {
private Stack<Integer> stackPush;
private Stack<Integer> stackPop;
public A11_TwoStackToQueue(){
this.stackPush = new Stack<Integer>();
this.stackPop = new Stack<Integer>();
}
// push向pop倒数据
private void pushToPop(){
if (stackPop.empty()) {
while (!stackPush.empty()) {
stackPop.push(stackPush.pop());
}
}
}
public void add(Integer newNum) {
stackPush.push(newNum);
//add方法中没有必要搬运数据
//pushToPop();
}
public int poll() {
if (stackPop.empty() && stackPush.empty()) {
throw new RuntimeException("Queue is empty!");
}
pushToPop();
return stackPop.pop();
}
public int peek() {
if (stackPop.empty() && stackPush.empty()) {
throw new RuntimeException("Queue is empty!");
}
pushToPop();
return stackPop.peek();
}
}
【思考讨论】请读者分析,此题思路和缓存有何相似之处?
阅读并点评至少1篇英文技术文章
英文原文链接:The Key To Accelerating Your Coding Skills
对比译文:https://www.jianshu.com/p/f5aec1637786
我的译文:
提升你编程能力的关键
Ken Mazaika
当你学习编程时,有这样一个“一切开始改变”的时候。在Firehose,我们喜欢称之为编程的拐点。这个阶段之后,你作为一个开发者的处理方式会非常不一样。达到拐点是一个在编程上变得自立自食其力的过程,达到不再需要新手般手把手教的程度。这个过程很难熬,可是一旦你克服了这一步,你会充满成就感并且自信慢慢。
在Firehose,我们的目标不仅仅是教会你Ruby,怎样创建一个web应用或者怎么写测试。虽然我们也确实教这些技能和其他更多的东西,我们的首要目标是加速学生们突破拐点以便他们具备解决自身遇到的问题的能力。我们相信能独立解决问题是一项及其有用的技能,教的这个方法是比仅学会如何开发一些APP更深入的东西。
培训阶段(3-8周的认真编程)
当你开始学习编程,目前有很多你不知道的内容,这些内容称之为专业领域知识。举些例子:知道如何用Ruby写个循环或者如何用Ruby从数据库获取一些东西。专业领域知识包括各种针对某个编程环境的特殊协议。
成为一个自给自足的开发者的第一步是学会如何做特定任务。在你学会做一些特定任务之后,如何把这些碎片整合起来开始变得重要。时间久了,你将开始熟悉模式最终,那些原本看起来令人不解的、外行的事情变得轻车熟路了。
对于新手,需要掌握的最重要的技能是注意细节
在浏览材料,像文档和教程的时候,十分重视细节非常重要。甚至小的打印和拼写错误也会导致错误信息和bug。刚开始,看错误信息是很一个很崩溃的经历,但这是学习过程中关键的一环。处理错误信息和问题这个阶段教会你在安全环境中最重要的编程技巧之一:细节导向。
Debug报错信息是非常重要的。真实的情况是,报错信息是编程的一部分:经验丰富的开发者和新手一样,同样会遇到报错信息,唯一的不同是,你解决报错信息的经验越多,你解决他们花的时间越少。有以下原因:
时间久了,你将学习如何读报错信息,迅速分离问题的相关细节。在你第一次看一条报错信息时,会花一些时间去研究它究竟是什么意思。但在你看了成百个报错信息后(是的,你会碰到上百条!),为了解决它,你可以准确的指出问题所在 和必要的相关细节。
你应该从你解决的每个报错信息中学到一些东西。千万别解决了bug就完事了,理解你解决的这段代码究竟怎么出的bug。通过从你的每一个错误中学习,下一次你犯了同样的错误,你将会更快的解决它
刚开始,你可能对你看看到的每个报错信息你都要寻求帮助。久而久之,你会学会更少寻求帮助,通过 再次检查你的代码和利用谷歌搜索
在培训阶段,你将听从指导。首先,你会发现听从指导很有挑战并且报错信息将会频繁的发生。时间久了,你会培养debug错误的能力,将更注重小的细节,你能迅速的取得很大的进步。随着课程的结束,你会注意到你已经能以更快的节奏去写代码了。
在这个拐点,一些人感觉很自信,他们开放放弃教学,开始不用结构化的指导去构架你项目,并且愉快的钻进程序的深区。其他学生希望获得更多的培训,尽可能获得更多的专业领域知识寻求全面的理解。不幸的是,培训只能带你走这么远,培训和指导给不了真正的自信。真正的自信来自于成功 解决了一个问题,一个你不如何去解决但凭借自己发现了一个解决的办法的问题。
编程不好的小秘密是...
你永远不会知道解决所有问题所需要知道的一切。进入到旅行,你可能想象自己最终学到了你需要你知道的一切,然后就大功告成了。这一幕永远不会发生
编程是一项终身学习的经历。有经验的软件工程师尽力寻找他们尚未解决问题的解决方案,因为这个过程将会给他们机会去学到更多的东西。如果你发现自己在等待,你觉得你知道了关于编程的一切这个时刻,记住这点:你等的这一刻永远不会来临,这是一个完美的事儿。
达到以下条件了,你将能够跳进你旅途的下一个阶段
拐点(2-4周的正确的思考心态)
拐点这个阶段是学习编程中最令人沮丧的阶段之一,但在很大程度上,这是唯一重要的阶段。这个阶段,你开始放弃老师的指导开始用没有人为你指出答案的解决办法。
某种程度上,你觉得还没准备好度过这个阶段,可能你想回到创建真实的边界去做的事。不要成为这种心态的牺牲品,你之所以沮丧是:
在转变阶段,你编程的速度比前一个阶段慢10-20倍
你也许开始质问自己并且怀疑自己是否胜任程序员。不安全感和怀疑在这个阶段是正常的。
尽管事实是你感觉你学习和完成事情的速度很慢,实际上,你正在实现最重要的事。当你的专业知识达到拔尖时,你学的一切将成为程序性知识
程序性知识是一种教你长期以来你不知道东西的能力。当你需要实现一个新功能,你应该做什么类型的谷歌搜索?在这时,当提到许多你想完成的事时你会感觉你在黑暗里,学会找到你的灯很重要,因为你不可能什么都了解,你需要学会如何解决手头的问题
大多数人没有意识到为了学会编程,专业知识和程序性知识你都需要掌握
你的余生,每天都要超越你的极限
一些软件工程师一旦他们找到了立足点就会待在自己的舒适区里。这类程序员以保守而不是为了不懈努力追求某些事而众所周知。相反,你应该坚持不懈的每天超越你的极限。程序员最普遍的辞职原因是放弃他们工作最常见的原因是:不再有什么挑战性因为我已经解决了所有有趣的问题。
不是试着在你的舒适区里写代码,你应该找出超出你当前技能集的问题。这是建立和增强你的技能的唯一方式。
这是一位Firehose的学员在突破他的拐点后说的话:
我还是感觉我进入了困境!我只是感觉变得更舒适了,这是我必须到达的地方!
在web开发中,实际上一起来的有2个转折点
web开发的转折点是当你胜任开发你想要的任意数据库驱动的应用。这意味着能够用一个简单的数据库存储和检索信息的大量页面来开发一个web应用。web开发者称之为“熟练CRUD”。在这个阶段,你应该能够整合第3方的库仅仅按Github或者博客上提供的文档来操作。
算法和数据结构转折点是一个不那么肤浅的转折点,实际上他很重要。一些克服了这个的人将掌握了他们工作工作中的编程语言,除了掌握编程的基础并且对能解决复杂编码问题的知识有了深入理解 。
精通数据结构和算法转折点的人将能够:
简而言之,只要你突破了这个转折点,你就掌握了数据操作和理解你的代码的执行意思。传统的计算机科学学分仅仅关注让学生通过数据结构和算法的转折点。许多大学用不是工业界常用的编程语言教这个,比如Scheme,Racket或者Lisp。
大多数的技术面试中,考虑到web开发容易实现,面试官通常认为你已经掌握了它,因此他们的问题聚焦在评估你的数据结构和算法的能力。这些问题通常集中在上面提到的主题:排序算法,反转链表和栈、队列、树的使用。
一旦开发者通过了web开发的转折点和算法和数据结构的转折点,他们将拿到了金钥匙。
这些开发者将有能力解决两者交叉的难题:在高级的web应用中需要开发的复杂的算法。这是专业的web开发者每天工作的核心
转折点的结果
转折点的最大结果听起来有点反常在你第一次听到时。深呼吸:
学习编程时,领域特定知识宏图中并不重要。
是的,我没有开玩笑。专业知识根本不重要。一旦你通过了转折点,这些概念将将流畅的翻译一周或两周的教程,甚至可能几天!
真正重要的是什么呢:
你对web开发框架有着熟练掌握
你对用任何编程语言写算法的复杂代码有着熟练的掌握
招聘经理希望开发者有着扎实的web开发和算法技能
当我在Paypal工作室,我的团队里聘了一位高级的Rails开发者,但他没有Rails方面的经验,他过去用Python,Lisp,Perl写过很多代码。几天里,他早已能够产生了大的影响力。几周内,巨大的影响。他迅速成为技术团队的leader,这是我参与过的最好的聘用决定之一。
别大惊小怪。许多人说过像“AngularJs这些天很火”,“JavaScript排名正上升”又或者"最近流行的是..."对这些我的回应是:“那又怎样呢”当你学习如何编程时,你唯一的目标应该是找到转折点并彻底消灭它。一旦你做成了,学习新的,流行的将根本不是一件难事。
变得自立。有能力学习新的编程技能而不需要组织指导,意味着你不在需要等待任何人来带你出来。这也意味着你需要学的大多数东西,你可以仅上网搜索和读各种材料就可以完成。
这不表示你立即知道了一切,而现在一切都确定但此时一切是“figure-out-able”,所以本质上,你是不可阻挡的。
转折点期间你将培养的技能
作为一个软件开发者,最好的参考材料是你之前写过的类似代码。当你完全理解你写过的代码,你不需要提交所有的细节到内存。这意味着在开发一个新功能时,你应该问自己的第一个问题是:我之前有没有开发类似的?如果你的答案是yes,重新看这个代码并且在你的脑袋里一行一行的走读。反复对自己解释,这里做了什么并且询问自己“在这里我能用同样的方法吗?”
在解释专业知识细节时视频是糟糕的。因为开发者花如此惊人长的时间去看视频。你想集成Google的Maps API。只要你有过做这个的经验,这只不过花不到一分钟的时间去打开在Github的代码,复制、粘贴到新的工程中。另一方面,看视频,通常话费10-30分钟去反复看。
尽可能高效的通过转折点的策略
因为通过转折点是学习编程中最重要的部分,你应该尽可能顺利的使得你取得进步。这意味着你应该在你还在培训期间就开始准备并且在这期间保持正确的思维方式。
在培训期间,从关于关注结构性资料中走出来,一直给自己一些有挑战性的问题
对于每一课,试着做一些超出你的培训范围之外的事。如果你接受的培训提供“挑战性”和“自我导向”的环节,把他们全部完成。解决没有指导的难题将给你在没有指导的情况下做事的宝贵经验。
尝试尽可能少的用教程。在Firehose,我们经常训练学生使用提供的文档来如何集成某些gems或者做一些是。而不是仅仅跟着教程中的指导来,那些指导是适合那些刚入门的人。许多学生将按照文档干活,使用教程作为备份。重视文档将把你看做已经通过转折点的开发者来看。当你独立开发时,取得令人舒适的阅读和遵守Github的文档将会帮助你提高。
专注于本质和反复使用。学会做普通的事情,比如从头开始梳理应用程序,学会做类似于用scratch重复写一个应用这种通用的事,上传一个新的app到Github和Heroku,或者尽早的做数据库的替换。
通过突破点有点难度。这里有些助你通过他的要点:
理解这是一个艰难的过程,对自己宽容点。同时,设置一个现实点的期望。你不能拿培训的超人级别的速度和你自己蜗牛般的学习速度做比较。记住你正在学很多东西,但在这个阶段,你正独立学习扩宽一个解决新问题的新的技能。
如果你你的自信心受到了打击,要知道你的这种感觉是完全正常的。继续工作,如果你还是没有自信,尝试和最近通过了转折点的人聊聊。他们将能够理解你的处境并且很自信的告诉你你现在经历的只是暂时的。持续工工作要始终如一,但不要过度劳累。这个期间,要知道你一天最多大概有6个小时是高产出的。精疲力竭的工作将会拉长你花在建立转折点的时间
最好的获得自信的方法是:死磕你有的任何问题,你的情绪一开始可能向过山车。有时,你感觉心头像火样高涨,但是15个小时后还在纠结同一个问题。这种两极变化很正常。
如果一些事你花了5分钟或者5小时都没有任何想法,这很让沮丧。但每次你坚持下去了,并且成功的实现了一个新功能,信心即增将是你急需要的一切。在没有外界帮助下解决了一系列的难题后,你会沉溺于在舒适区之外构建东西的感觉你将会对解决你舒适区外的事变得上瘾。
怎么知道你已经突破了转折点呢?
转折点过程的最后一个阶段是接受。接受软件开发是个持续学习的过程。接受你成功学会一切的感觉,但这意味着你应该开始思考解决更复杂的问题。
目前为止你体验过转折点吗?分享这篇博客和你的朋友开始交流,你将会惊讶道:如此多的人已经突破了转折点和度过了这个阶段。
学习至少一个技术技巧
业务中需要用到Java解析Excel数据,程序员从0开始开发,势必bug尸横遍野。目前主流的Excel处理框架有Apache下的POI和阿里巴巴的easyExcel两个开源组件。easyExcel是对POI的改进,更加好用。我选择了后者EasyExcel,第一次用开源项目下的Github代码,经验不是很足,折腾了一天。
Github地址:https://github.com/alibaba/easyexcel
总结:
Github上下载来的代码,包含源码和单元测试两部分,单元测试可以直接运行查看效果,也可以查看源码了解实现过程。
自己的项目中使用时,先在pom.xml中添加如下依赖,然后就可以参考文档EasyExcel或者单元测试的源码来进行开发了。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
引用:https://blog.csdn.net/weixin_37304575/article/details/109101171
分享一篇有观点和思考的技术文章
本期分享由阿里大佬杨冠宝,花名“孤尽”主编的技术规范阿里巴巴Java开发手册。配套IDE检测插件,已经开源:https://github.com/alibaba/p3c
原文:https://www.cnblogs.com/PengLuo22/p/14023550.html