" 每週寫一個 ARTS:Algorithm 是一道算法題,Review 是讀一篇英文文章,
Technique/Tips 是分享一個小技術,Share 是分享一個觀點 "
ARTS 系列各部分內容導航可以看這裏:ARTS 系列 目錄導航
Algorithm - x 的平方根
題目鏈接:https://leetcode-cn.com/problems/sqrtx/
代碼倉庫:https://github.com/fhx1998/LeetCode/blob/master/src/MySqrt69.java
“利用二分法的思想進行求解”
Review - The Key to Accelerating Your Coding Skills
- Paying close attention to detail is important when going through materials like documentation or tutorials.
- Debugging error messages is incredibly important.
- Over time, you will learn how to read error messages
- You should learn from each error message that you resolve.
總結一下文章的主要內容
第一個階段,認真對待 debug ,並覆盤代碼的錯誤原因。想到自己平時 debug 就是 debug 完成,沒有覆盤。很多問題就只是在當下解決了,沒有反饋到下一次可能出現的錯誤中。
第二個階段,心理問題。在到達拐點,或者說瓶頸的時候,提升沒有以前那麼明顯。這時候的心理活動開始豐富起來了,想着自己是不是不太行,就可能失去前進的動力。
收穫
多多覆盤,多多總結,多多實踐。
Technology - 再談 Java 比較器
之前的 ARTS 系列 第 2 周 裏的分析 Java 比較器部分,現在看來完全是錯的。。。。
從源碼分析 Java 比較器的排序原理:
Collections 類帶有比較器的 sort 方法會進入到 List 接口的一個默認方法:
Collections.sort(dogs, new DogAgeComparator());
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
...
}
再進入到 Arrays 類的 sort 方法:
public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null) {
sort(a);
} else {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, 0, a.length, c, null, 0, 0);
}
}
如果有自定義的外部排序(Comparator),就會進入第 4 行的 else 語句塊中,其中的 LegacyMergeSort 排序已經被廢棄(如果你指定使用該方法也可以),現在用的是 TimSort 的排序方法,相比起舊版本直接使用 歸併排序算法,新版本在此基礎上還引入了 “二分插入排序” 的優化。
如果沒有自定義的外部排序(那麼類必須實現 Comparable 接口),就會進入第 3 行的 sort 方法中,處理邏輯和上面展示的代碼的差不多,就不展開了。
接下來,因爲我們討論的主題是 Comparator 和 Comparable 中方法的返回值對排序結果的影響,新版本雖然優化了排序性能,但原本的思想沒有改變。
所以我們採用舊版本的代碼來分析:
LegacyMergeSort 的 mergeSort 算法中的:
或者:
最爲關鍵的部分,第 4 行使用到的 compare 方法中的 dest[j-1] 和 dest[j],調用結果** > 0** 的條件下,會進行 swap,交換他們的位置。
看上面的圖片, o1 代表的是暫時排在前面的元素,o2 代表排在後面的元素。
只要記住,return 值 > 0 的時候會交換 o1 和 o2 的位置,以此來實現你想要的排序規則。
最後,給兩個具體代碼:
Share - 你所擁有的每天的碎片化時間
比如我自己,一天之中就有許多的空閒時間,比如餐前,餐後的時間,在社交網絡上瞎聊的時間。
你不能指望在碎片化時間裏去學習完一個統一複雜的問題,可以利用這些時間來回顧,記錄一些“流水線”的想法,或者加強一些無爭議的知識。
我自己也還在培養這種意識,現在的我在碎片化時間裏總是想着好好犒勞一下自己,畢竟都那麼累了。
現在想想看,其實可以把學習這件事看成一件非付出的事情,去營造正反饋。
根本原因在於,把學習這件事看成了一種“負擔”。