ARTS是什么?
Algorithm:每周至少做一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Techni:学习至少一个技术技巧;
Share:分享一篇有观点和思考的(技术)文章。
Algorothm
这周算法主要刷了两道双指针的题目,分别是有序数组的 Two Sum 和两数平方和。
1、有序数组的 Two Sum Leetcode :
leetcode 上的地址是 : 167. Two Sum II - Input array is sorted
这道题之前刷过,就当作重新回顾了一遍 : 有序数组的 Two Sum
2、两数平方和 : 判断一个数是否为两个数的平方和。
leetcode 上的地址是 : 633. Sum of Square Numbers
解题思路 : 使用双指针,一个指向值较小的元素,一个指向值较大的元素。较小的元素从的指针从头开始遍历,较大元素的指针从尾向头遍历。
- 两个指针指向元素的平方和 powSum == c , 则即为所求;
- 如果 powSum > c, 则向前移动较大元素的指针,使 powSum 变小;
- 如果 powSum < c, 则向后移动较小元素的指针,使 powSum 变大。
class Solution {
public boolean judgeSquareSum(int c) {
int i = 0;
int j = (int) Math.sqrt(c);
while (i <= j) {
int powSum = i * i + j * j;
if (powSum == c) {
return true;
} else if (powSum > c) {
j--;
} else {
i++;
}
}
return false;
}
}
Review
《What’s in a Name: Java Naming Conventions》这是 DZone 上的一篇文章,是关于 Java 中的一些命名约定。其中提到的大致如下:
Package
- 基本名称应该以相反的顺序包含公司的域名,加上没有任何额外字符的项目名称,并且要求全部均为小写字母。当然也可以添加版本名称,示例如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190610140831805.png
Class
- 类名必须为名词,可以使用驼峰形式来表示,但是第一个单词首字母一定要大写。并且应该要相对明确告诉使用者有哪些功能或变量,同时必须专门说明(在接口中说明)。示例如下:
Interface
- 接口名称必须是形容词,有时可以是名词,比如 List 或 Map。另外,接口必须是驼峰形式,但是第一个单词的首字母要大写。示例如下:
Variables or Fields
- 全局变量或者局部变量必须是名词,简短,有意义,并且应该明确是什么作用,应该用于什么类型。全局变量和局部变量应该用驼峰形式表示,但首字母要小写
- 不要以 ‘_’ 或者 ‘$’ 等符号开头命名
- 对于 boolean 类型的字段,应该要以
is
或has
开头来命名
Methods or Functions
- 方法应该要是一个动词
- 方法命名要用驼峰形式,但首字母要小写
- 通常,get和set用于分别获取和设置数据(setter和getter)
Generics
- 最好使用单个大写字符
- 通常,使用 T 来表示,也可以使用 V
- Java 一般使用 E 作为列表元素,K 和 V 作为映射,使用 S 作为服务加载器
- 不要使用多字符
枚举类型&注解
- 枚举和注解分别类似于类和接口
- 在枚举字段中,必须都是大写的,因为默认情况下它们是最终静态的
Tip/Techni
分享几个 Linux 的小 tip,来自耗子叔在酷壳上的一篇文章《应该知道的LINUX技巧》,文中首先说明了在Unix/Linux下,最有效率技巧的不是操作图形界面,而是命令行操作,因为命令行意味着自动化。文章从几个方面来分享了一些小技巧: 基础,日常和数据处理以及系统调试。比如:
基础
- 学习 Bash
- 学习 vim
- 了解 ssh ,明白不需要口令的用户认证(通过ssh-agent, ssh-add),用scp而不是ftp传文件,等等。
- 熟悉bash的作业管理,如: &, Ctrl-Z, Ctrl-C, jobs, fg, bg, kill, 等等。当然,你也要知道Ctrl+\(SIGQUIT)和Ctrl+C (SIGINT)的区别。
- ls 和 ls -l (你最好知道 “ls -l” 的每一列的意思), less, head, tail 和 tail -f, ln 和 ln -s (你知道明白hard link和soft link的不同和优缺点), chown, chmod, du (如果你想看看磁盘的大小 du -sk *), df, mount。
- 基础的网络管理: ip 或 ifconfig, dig。当然,原作者还忘了如netstat, ping, traceroute, 等。
- 理解正则表达式,还有grep/egrep的各种选项。比如: -o, -A, 和 -B 这些选项是很值得了解的。
- 学习使用 apt-get 和 yum 来查找和安装软件(前者的经典分发包是Ubuntu,后者的经典分发包是Redhat)。
还有一些其他的技巧,具体可以点开原文阅读一下。
Share
这次的分享主要分为两个部分:
一、这周无意中读了一篇文章读书|软技能:代码之外的生存指南,文章中提到的代码之外的指南说得很好,值得学习和思考。其中提到了上下班的时间如何安排以及如何让自己快速成长、如何能成为一个能做成事情的人等几个方面。提到的一些点确实是值得技术人思考的,对于上班时间和下班时间的安排主要如下(前提,在某个公司待上3个月,上下班不忙):
上班时间:
-
千万别在上班学公司之外的东西,因为会心虚,记不牢、注意力不能集中;
- 阶段性小结;(例如和同事一起如何做出来这样的动画效果,然后总结出核心技术,把它整合到自己的知识系统);
- 浏览旧代码、看公司的技术Blog。
核心:总结、总结、再总结,然后把核心整合到自己的知识系统,无论对外对内讲起相关技术,你不仅仅是参与,而是看透了本质。
下班时间:
-
千万别写公司的代码,因为他会无底洞的消耗你的时间;一路走过来,压力挺大的;
- 定时刷源码、项目、Blog,仅仅是纳入知识,不动手;
- 定时敲代码,把自己当做产品经理,设计产品给自己做,故意刁难自己;(里程碑上线去玩玩)
- 定时和家人沟通,保持良好的关系。
如何让自己快速成长
- 转变心态:把自己当做产品
- 自学能力:参与技术分享、阅读杂书等
- 技术输出:打造个人品牌
- 等等
如何能成为一个能做成事情的人
- 必须不惜一切代价避免争吵,远离消极的人;
- 确立明确的方向,否则你走的每一步都是徒劳的;
- 等等
具体可以阅读一下这篇文章,还是有很多可取之处的。
二、这周更了几篇文章,一篇总结了一些国内非常优秀的博客和网站,另一篇则是总结了一些国外非常优秀的博客和网站,还有一篇是总结了手中的一些电子书,整理成文章分享给需要的人。这几篇文章分别是: