- Algorithm。主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。关于做Leetcode的的优势,你可以看一下我在coolshell上的文章 Leetcode 编程训练 - 酷 壳 - CoolShell。
- Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。所以,需要你阅读并点评至少一篇英文技术文章,我个人最喜欢去的地方是http://Medium.com(需要梯子)以及各个公司的技术blog,如Netflix的。
- Tip:主要是为了总结和归纳你在是常工作中所遇到的知识点。学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识。
- Share:主要是为了建立你的影响力,能够输出价值观。分享一篇有观点和思考的技术文章
Algorithm 算法
整数反转
两种方式
1.模10
-
使用int接收(有误)
public static int reverse(int x) {
int returnInt = 0;
if (x > Integer.MAX_VALUE || x < Integer.MIN_VALUE) {
return 0;
}
while (x/10 !=0 ) {
returnInt = returnInt * 10 + x % 10;
x = x/10;
}
try {
returnInt = returnInt * 10 + x;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
return returnInt;
}
使用int接收返回值,使用int接收,尽管最开始判断了是否超过范围,但是在反转的最后一部时有可能会超出范围,
比如传递的参数是2147483647,在returnInt = returnInt * 10 + x;这个最后一部时,计算结果为-1126087180,数值已经有问题了。所以为了避免结果超过int最大值,要使用long来接收反转的值,最后再判断反转后的值是否大于int最大值。
-
使用long接收
public static int reverse(int x) {
long returnInt = 0;
if (x > Integer.MAX_VALUE || x < Integer.MIN_VALUE) {
return 0;
}
while (x/10 !=0 ) {
returnInt = returnInt * 10 + x % 10;
x = x/10;
}
returnInt = returnInt * 10 + x;
if (returnInt > Integer.MAX_VALUE || returnInt < Integer.MIN_VALUE) {
return 0;
}
return (int)returnInt;
}
2.字符串反转
public static int reverse(int x) {
long returnInt = 0;
if (x > Integer.MAX_VALUE || x < Integer.MIN_VALUE) {
return 0;
}
if (x/10 ==0) {
// x是正负一位数.
return x;
}
String xS = String.valueOf(new Integer(x));
// 负数标识.
boolean negative = false;
if (x < 0) {
xS = xS.substring(1, xS.length());
negative = true;
}
StringBuffer sb = new StringBuffer(xS);
sb = sb.reverse();
xS = sb.toString();
// 去除开头的0.
while (xS.startsWith("0")) {
xS = xS.substring(1, xS.length());
}
returnInt = Long.parseLong(xS);
if (negative) {
returnInt = -returnInt;
}
if (returnInt > Integer.MAX_VALUE || returnInt < Integer.MIN_VALUE) {
return 0;
}
return (int)returnInt;
}
Review 回顾
看到耗子叔《左耳听风》第71节《程序员练级攻略:正式入门》中推荐的《The Key To Accelerating Your Coding Skills》于是开始阅读,估计要花上几周,英语是在太烂,所以原谅我在这里把不会的单词词组也列出来,毕竟耗子叔也说是为了学英语(哭)。
inflection point:拐点
phase:阶段
self-sufficient:自给自足
frustrating :令人沮丧的
accelerate:加快,促进
encounter:遭遇
invaluable :无价的;非常宝贵的
start out:启程,出发;开始(着手)做
domain-specific:特定领域
extract :提取;获得
encompasses:包含
protocols:协议
apparent:明显的
patterns:模式
initially:最初
over time:随着时间的过去
Once you master certain tasks, the broad strokes of how the pieces fit together will start to become apparent
一旦你精通某一工作,那么它是如何组成的将会变得明显起来。
materials:材料
tutorials:教程
Even the most minor typos and misspellings will result in error messages or bugs
即使最细微的拼写错误也会导致错误信息和bug
frustrating :令人沮丧的
crucial:至关重要的;关键性的
Seeing error messages is a frustrating experience at first, but it’s a crucial step in the learning process
一开始看到错误信息是一种令人沮丧的体验,但这也是学习过程中至关重要的一步。
detail-oriented:注重细节
incredibly:极端地;极其;令人难以置信
Debugging error messages is incredibly important.
调试错误信息极其重要
The fact of the matter is, error messages are just a part of programming: they are seen by inexperienced and very experienced developers alike
事实上,错误信息恰恰是编程的一部分:没经验的和有经验的开发人员都会看到它们。
Tip 知识点
sql相关的问题
能关联就不要子查询,有时候子查询会慢上百倍
对于我来说,子查询的方式确实更容易让人理解,当一个表中的数据等于另一个表中的数据时(=),当一个表中的数据在另一个表的范围中时(in),巴拉巴拉,这速度简直是给自己挖坑。
之前还有一个sql没有理清思路,使用了union all 的方式,其实左关联后用or的方式就解决了。
总之要理清思路,多数时候还是可以进行表关联的。
select
DISTINCT
f.docId AS id,
f.file_name AS file_name,
f.create_time AS create_time,
f.update_time AS update_time,
f.create_user AS create_user,
f.update_user AS update_user,
f.file_url AS file_url
from
view_file_manage f
LEFT JOIN tb_sec_mc_task task on (f.groups_id = task.task_id)
/*LEFT JOIN tb_sec_mc_task task1 on (task.task_root_node = task1.task_id)*/
LEFT JOIN tb_task_project pro on (task.project_id = pro.project_id)
LEFT JOIN tb_task_user_relation ttur on
(
/*(SUBSTRING_INDEX(ttur.path_code, '-', 1) = task1.task_path_code and ttur.role_type in(31,35,41,51) and ttur.project_id=task1.project_id)*/
(ttur.task_id = task.task_id and ttur.role_type in(31,35,41,51))
or
(ttur.project_id = task.project_id and ttur.role_type in(11,15,21,1))
)
WHERE f.file_name is not NULL and ttur.user_id =#{userId}
<if test="fileName != null and fileName!=''">
AND f.file_name LIKE CONCAT("%"#{fileName,jdbcType=VARCHAR}"%" )
</if>
<if test="projectId != null and projectId !='' and type == 'project'">
AND pro.project_id = #{projectId}
</if>
<if test="taskId != null and taskId!='' and type == 'task'">
AND task.task_id = #{taskId}
</if>
ORDER BY f.update_time DESC, f.create_time DESC
Share分享
这篇文章中关于浏览器的观点,看过之后发人深省。
消除客户端的多样性,并且跨平台提供统一编程接口的,是浏览器
浏览器主要改变的是软件分发的方式,让软件可以即取即用,无需安装。
假如软件包足够小,那么这种行为和Web应用就毫无区别。不同之处只在于Web应用基于的指令不是机器码,而是更高阶的JavaScript脚本。
JavaScript因为指令更高阶,所以程序的尺寸比机器码会有优势。但另一方面来说JavaScript是文本指令,表达效率又要比机器码低。
浏览器的地位非常特殊,我们可以看作操作系统之上的操作系统。一旦某种浏览器流行起来,开发人员都在浏览器上做应用,那么必然会导致底层操作系统管道化,这是操作系统厂商所不愿意看到的。
而如果浏览器用户量比较少,那么通过它能够触达的用户量就太少,消除不同底层操作系统差异的价值就不存在,开发人员也就不乐意在上面开发应用。
有趣的是,移动浏览器的战场似乎是从中国开始打起的,这就是微信引发的小程序之战,它本质上是一场浏览器的战争。
浏览器是一个基础软件, 它能够解决多大的问题,依赖于它的市场占有率。