ARTS
Algorithm:每周至少做一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Tech:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章;
Algorithm
367. 有效的完全平方数
https://leetcode-cn.com/problems/valid-perfect-square/
这道题用的是非常的规矩的二分查找,其实这个思路不难,难的是你需要正确的写出二分查找。
写二分查找要注意几个要点:
(1)循环条件:left <= right。
(2)mid 的取值(中点的取值):如果是
int mid = (left + right) / 2;
如果left 和 right 比较大的话,那么就会出现溢出的情况,所以我们需要用
int mid = left + (right - left) /2;
这样就是不错的改进的方法。如果把性能优化到极致的话:
int mid = left + ((right - left) >> 1);
这个就是最好的写法了
(3)left 和 right的更新
left = mid + 1, right = mid + 1;
class Solution {
public boolean isPerfectSquare(int num) {
boolean res = false;
int left = 1;
int right = num;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (mid == num / mid && num % mid == 0) {
return true;
} else if (mid < num / mid) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return res;
}
}
反正写二分查找的时候注意好以上的三个要点,就容易了
451. 根据字符出现频率排序
https://leetcode-cn.com/problems/sort-characters-by-frequency/
这题真的我学艺不精,不晓得如何融会贯通集合中的几个函数,其实解题的思路非常简单的,就是吧字母的出现收集一下,然后就根据数据量的大小输出就好了,但是如果对这些排序啊不熟悉,那就是很难。
Show The Code:
class Solution {
public String frequencySort(String s) {
Map<Character, Integer> map = new HashMap<>();
int len = s.length();
for (int i = 0; i < len; i++) {
char tempChar = s.charAt(i);
if (map.containsKey(tempChar)) {
map.put(tempChar, map.get(tempChar) + 1);
} else {
map.put(tempChar, 1);
}
}
StringBuilder res = new StringBuilder();
ArrayList<Map.Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());
list.sort(new Comparator<Map.Entry<Character, Integer>>() {
@Override
public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
for (Map.Entry<Character, Integer> item : list) {
int lenTemp = item.getKey();
for (int i = 0; i < lenTemp; i++) {
res.append(item.getKey());
}
}
return res.toString();
}
}
思路真的简单,但是实操起来,没有点编码能力写不出来的。
Review
https://dzone.com/articles/a-birds-eye-view-on-java-concurrency-frameworks-1
A Bird’s-Eye View on Java Concurrency Frameworks
全局来看,Java的并发的框架
对几种现在Java流行的并发框架做了简单的介绍,以及简单的测试
Tip/Tech
吧Map.Entry<> 放到list里面进行排序。
Share
Learning From the Feynman Technique
https://medium.com/taking-note/learning-from-the-feynman-technique-5373014ad230
非常好的一篇文章,其实全篇精华就在这几个字
-
Identify the subject
-
Teach it to a child
-
Identify your knowledge gaps
-
Organize + simplify + Tell a story
这个就是物理大家,费曼先生的一些最重要的精华部分了。