what is ARTS?
Algorithm:每周至少做一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Techni:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章。
1.Algorithm
题目1:max-points-on-a-line
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.给定二维平面上的n个点,求同一直线上的点的最大个数。
解题思路(穷举法)
第一步:循环所有点 以第i个点作为基点,计算其与第i+1个点的斜率 k1
第二步:计算第i+1个点 与 i+2个点的斜率k2
第三步:判断 k1 = k2 是否相等 相等则加1
需要注意 重(chong)点,重点必定在同一直线上 直接+1
第四步:比较其与当前最大值那个大
/**
* Definition for a point.
* class Point {
* int x;
* int y;
* Point() { x = 0; y = 0; }
* Point(int a, int b) { x = a; y = b; }
* }
*/
public class Solution {
public int maxPoints(Point[] points) {
int length = points.length;
if (length <= 2) return length;
int x1, y1, x2, y2, x3, y3;
int dx1, dy1, dx2, dy2;
int max = 2;
for (int i = 0; i < length; i++) {
x1 = points[i].x;
y1 = points[i].y;
// 同线
int num = 1;
// 重合点数目
int temp = 0;
for (int j = i + 1; j < points.length; j++) {
x2 = points[j].x;
y2 = points[j].y;
dx1 = x2 - x1;
dy1 = y2 - y1;
if (dx1 == 0 && dy1 == 0) {
temp++;
} else {
num++;
for (int m = j + 1; m < points.length; m++) {
x3 = points[m].x;
y3 = points[m].y;
dx2 = x3 - x2;
dy2 = y3 - y2;
if (dx1 * dy2 == dx2 * dy1) {
num++;
}
}
}
if ((num + temp) > max) {
max = (num + temp);
}
num = 1;
}
}
return max;
}
}
题目2:insertion-sort-list
Sort a linked list using insertion sort.插入排序
解题思路
第一步:定义一个临时存储空间,先拿两个排序,将其放入这个空间
第二步:拿第三个与这两个排完序的第一个比,如果比它大就与第二个比
第三步:比较完放置于正确的位置
重复二三步 输出结果
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode insertionSortList(ListNode head) {
ListNode result = new ListNode(0);
// 当前链表
ListNode curNode = head;
// 临时链表
ListNode preNode = result;
while(curNode != null){
// 指向下一个
ListNode next = curNode.next;
preNode = result;
// 如果临时链表没有子节点 并且 临时链表的第一个 小于当前链表的第一个的值
// 就接着遍历下一个 直到找到 待插入的节点的正确位置
while(preNode.next!=null && preNode.next.val < curNode.val) {
preNode = preNode.next;
}
// 将当前节点加入临时链表中
curNode.next = preNode.next;
preNode.next = curNode;
curNode = next;
}
return result.next;
}
}
2.Review
原文链接:每个程序员都应该知道的最基本的事情
3.Tip/Techni
Let’s Encrypt 是国外一个公共的免费 SSL 项目
# 安装git
yum install git;
# 获取letsencrypt
git clone https://github.com/letsencrypt/letsencrypt
# 进入letsencrypt目录
cd letsencrypt
# 生成证书
./letsencrypt-auto certonly --standalone --email xxx@163.com -d xxxxxx.com -d www.xxxxxx.com
参考链接:https://www.jianshu.com/p/3ae2f024c291
4.Share
工程师文化 vs KPI文化
- 工程师文化是由内而外的引导和自然发生, KPI文化是由外而内的信仰和强行注入。
- 工程师文化着眼未来, KPI文化活在当下。
- 工程师文化痛恨KPI,我不爱的我不做,我爱的我疯狂。 KPI文化唯KPI说话,爱不爱都要像战士一样完成。
工程师文化的前提条件
信任
:leader和产品对工程师绝对的信任是工程师文化的最基本条件。如果他说要用一个更优雅的方法解决一个问题,但要花更多的时间,请你选择相信他。好的工程师非常懒惰,他这么做一定是为未来的工作提高效率。
工程师文化的特征
小团队:7-12人的团队是比较适合的团队大小
- Move Fast and Break Things(不破不立);
- Huge Impact with Small Teams(以少为多,精准打击);
- Be Bold and Innovative(勇敢追求卓越);
技术挑战产品是因为也许你不知道还有更好的技术和架构可以更简单更有效地完成一个业务任务。
所有的业务deadline倒排都在一定程度上逼迫技术做出妥协,并且这些妥协慢慢变成合法理由:我的代码不好的原因是业务压力太大。
测试的一些原则:
- 代码提交前通过所有测试:测试就是验收标准,是需求验收的代码转换。原则上一条验收标准可以对应至少一个断言(assert),没有断言的测试被视为无效测试;
- 用given/when/then语态写单元测试;
- 要让测试代码更容易写必须分离代码逻辑与数据库读写;
- 合理使用mock/stub技术,测你要测的,让你的测试更有效;
- 异步测试不要用sleep;
- 最好的debug手段就是测试;
- 单元测试耗时最短,多用单元测试覆盖代码逻辑;
- 越是集成测试数量应该越少,因为代价很大,性价比不高;
- 静态代码质量分析应该伴随每次持续集成。
git分支减少
结对编程
总结:自己目前处于一个小公司,就简单来说 codereview就没有。在我接手某个旧项目的期间就有发现部分业务代码就是错误的,只是线上还未发现。其实有经验的开发看一遍都会发现这些问题。但因为都是自己做自己的,提交测试,过了就上线,先不说一些隐藏深的,就一些简单的问题都像个定时诈弹藏在那里。
努力,跳个大公司。