ARTS挑战记录
第一周 2022.03.21-2022.03.27
第二周 2022.03.28-2022.04.03
ARTS挑战
- Algorithm。主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。关于做Leetcode的的优势,你可以看一下我在coolshell上的文章 Leetcode 编程训练 - 酷 壳 - CoolShell。
- Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。所以,需要你阅读并点评至少一篇英文技术文章,我个人最喜欢去的地方是http://Medium.com(需要梯子)以及各个公司的技术blog,如Netflix的。
- Tip:主要是为了总结和归纳你在日常工作中所遇到的知识点。学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识。
- Share:主要是为了建立你的影响力,能够输出价值观。分享一篇有观点和思考的技术文章。`
提示:以下是本篇文章正文内容,下面案例可供参考
Algorithm
2.两数相加
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
题解:其实思路比较简单,但是因为在提示里看到了递归,一直在想递归,写的复杂了;
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode result = new ListNode();
int i = l1.val + l2.val;
result.val = i % 10;
result.next = getNext(l1.next, l2.next, result, i);
return result;
}
ListNode getNext(ListNode l1, ListNode l2, ListNode head, int i) {
if (l1 == null && l2 == null) {
if (i >= 10) {
ListNode last = new ListNode();
last.val = i / 10;
return last;
}
return null;
} else {
ListNode next = new ListNode();
if (l1 != null && l2 != null) {
next.val = (l1.val + l2.val + i / 10) % 10;
i = l1.val + l2.val + i / 10;
next.next = getNext(l1.next, l2.next, next, i);
} else if (l1 != null) {
next.val = (l1.val + i / 10) % 10;
i = l1.val + i / 10;
next.next = getNext(l1.next, null, next, i);
} else {
next.val = (l2.val + i / 10) % 10;
i = l2.val + i / 10;
next.next = getNext(null, l2.next, next, i);
}
head.next = next;
if (next.next == null && i >= 10) {
ListNode last = new ListNode();
last.val = i / 10;
next.next = last;
}
return next;
}
}
Review
本周还是来自medium.org的一篇简单文章,开发者应该知道的六种算法,作者Richard Warepam。
- 排序算法
冒泡排序(Bubble Sort)
归并排序(Merge Sort)
快速排序(Quicksort)
堆排序(Heap Sort) - 搜索算法
二分查找(Binary Search)
深度优先(Depth-first Search)
广度优先(Breadth-first Search) - 动态规划
- 递归
- 分治法
- 哈希(从Hash表中取元素快)
Tip
重要不紧急>紧急不重要
Share
本周分享来自美团技术团队的一篇文章,Java线程池实现原理及其在美团业务中的实践,关于线程池的内容此处不再多讲,最终结论是想要用好线程池,建议从线程池参数动态化和线程池监控两方面入手,进行线程池的调优。
总结
加油吧