- Algorithm。主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。关于做Leetcode的的优势,你可以看一下我在coolshell上的文章 Leetcode 编程训练 - 酷 壳 - CoolShell。
- Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。所以,需要你阅读并点评至少一篇英文技术文章,我个人最喜欢去的地方是http://Medium.com(需要梯子)以及各个公司的技术blog,如Netflix的。
- Tip:主要是为了总结和归纳你在是常工作中所遇到的知识点。学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识。
- Share:主要是为了建立你的影响力,能够输出价值观。分享一篇有观点和思考的技术文章
Algorithm 算法
通过Stack栈来实现,Stack的peek()取最后一个元素,pop()弹出最后一个元素的方法非常有用。
class Solution {
public boolean isValid(String s) {
if (s == null) {
return false;
}
String[] split = s.split("");
Stack<String> st = new Stack<String>();
for (int i = 0; i < split.length; i++) {
// 只括号有关的字符串.
if ("[]{}()".contains(split[i]) && !"".equals(split[i])) {
// 判断是否和前面的括号成对.
if (!st.isEmpty() && ( (")".equals(split[i]) && "(".equals(st.peek()))
|| ("}".equals(split[i]) && "{".equals(st.peek()))
|| ("]".equals(split[i]) && "[".equals(st.peek()))
)) {
// 成对,弹出最后一位
st.pop();
} else {
// 不成对,添加.
st.push(split[i]);
}
}
}
return st.isEmpty();
}
}
这是我最开始的想法
首先判断数量,有一个“(” 就要有一个“)”,数量必须相对,有三种括号。 其次是位置问题,就是说,“(”和“)”之间,要不就什么都都没有,要不然之间只能有偶数个字符。
实现起来非常的麻烦了
另一位大佬的写法
class Solution:
def isValid(self, s):
while '{}' in s or '()' in s or '[]' in s:
s = s.replace('{}', '')
s = s.replace('[]', '')
s = s.replace('()', '')
return s == ''
当然这种写法只适用于,字符串中只有括号的情况,不过也很容易修改。
这个写法的问题,当然是效率问题,如果一个串足够长或者成对的括号出现在比较后面的话,这种循环的次数就会非常多,效率非常低,但是这么写,代码是真的简洁。
Review 回顾
继续阅读耗子叔《左耳听风》第71节《程序员练级攻略:正式入门》中推荐的《The Key To Accelerating Your Coding Skills》
extract :提取;索取,设法得到(对方不愿提供的信息、钱财等);
relevant:相关的;有价值的;有意义的
pinpoint :明确指出,确定(位置或时间);准确解释(或说明)
不要被bug打败,第一次遇到的时候解决起来可能会很慢,但是十次几十次上百次后,这些问题就不在是问题了,一眼看到就能明确指出错误的位置,和错误的原因。
遇到了bug不要只是解决了就完事儿了,要思考为什么会发生这种问题,想想触发它的原因,让之后的代码更健壮。
Initially:最初
frequently :频繁地;经常
instruction:指示;命令;吩咐
wrapping up:总结
rapid:迅速的;快速的;瞬间的;短时间的
True confidence comes from struggling through a problem you have no idea how to solve, and discovering a solution on your own.
当你遇到一个不知道如何解决的问题,并因此苦苦挣扎,当你依靠自己解决了它,并且总结出了结论和经验,这才是获取自信的正确方式。
envisioned:展望;想象
Going into the journey, you probably envisioned yourself eventually learning everything you need to learn, and then being squared away. This moment will never happen.
在这段学习的旅程中,你也许会想象最终你学会了所有你需要学习的东西,将所有一切问题都摆平,然而这个时刻永远都不会发生。
startle:惊吓
decipher:破译,辨认
mentality:心态
capable:有能力,有才能;足以胜任
insecurity:不安全的
Despite:尽管
accomplish:完成
because you can never know everything there is to know, so you need to be able to teach yourself how to solve the problem at hand.
因为你永远不可能知道所有你需要知道的事情,所以你需要的是教会自己如何解决手头上的问题。
For the rest of your life, go outside your limits every single day
在你的余生里,每天都要超越自己的极限
Some software engineers stay inside their comfort zone once they find their footing.
有些软件工程师一旦找到他们立足的地方就停下脚步,待在他们的舒适区里。
maintenance:维护;保养;维持;保持;
strive:努力
These types of programmers are known as maintenance programmers– not something you should strive to be.
这种类型的程序员被称为“维护程序员”,这种类型的程序员不应该是你努力成为的类型。
Tip 知识点
学习 许式伟的架构课-06操作系统入场 其中操作系统的启动过程这一段很深刻
计算机加电启动后,中央处理器(CPU) 会从一个固定的存储地址加载指令序例执行。通常,这个固定的存储地址指向计算机主板的ROM上的一段启动程序(BIOS) 。这段启动程序通常包含以下这些内容。
●存储设备的驱动程序,用以识别常规的外置存储设备,比如硬盘、光驱、U盘。
●基础外部设备的驱动程序,比如键盘、鼠标、显示器。
●设备和启动配置的基础管理能力。
●支持执行外置存储中引导区的机器代码程序。
●跳转到外置存储引导区的固定地址,把执行权交给该地址上的引导程序。
引导区的引导程序有长度限制,只能做非常少的事情。在常规情况下,它只是简单地跳转到真正的操作系统的启动程序,但有时计算机上安装了多个操作系统,此时引导程序会提供菜单让你选择要运行的操作系统。
这样,操作系统就开始干活了。
Share分享
分享一个网站,也是从别的ARTS那里翻到的
虽然自己是一个后端,但是这个网站中还是有好多可以学习的东西