所謂ARTS:每週至少做一個LeetCode的算法題;閱讀並點評至少一篇英文技術文章;學習至少一個技術技巧;分享一篇有觀點和思考的技術文章。(也就是Algorithm、Review、Tip、Share 簡稱ARTS)這是第十六期打卡。
寫作課已經進行到一半了,還是那句話,適合自己的纔是最好的。或許寫作課對有些人來說是好的,也可能對有些人來說是不需要付出的,這個還需要看每個人的想法,想走的路子,適合自己的纔是最好的哦。
Algorithm LeetCode算法
合併兩個有序數組
(https://leetcode-cn.com/problems/merge-sorted-array/)
題目描述:給定兩個有序整數數組 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成爲一個有序數組。
說明:
示例 1:
輸入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6], n = 3輸出: [1,2,2,3,5,6]
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
輸出: [1,2,2,3,5,6]
方法一:合併後排序
先來給大家看一個從Java角度來說,最最簡單的做法,就是使用Java內置的API來搞定。我就不說啦,請看代碼。用System.arraycopy進行合併,在用Arrays.sort進行排序。
public static void merge(int[] nums1, int m, int[] nums2, int n) { System.arraycopy(nums2, 0, nums1, m, n); Arrays.sort(nums1);}
System.arraycopy(nums2, 0, nums1, m, n);
Arrays.sort(nums1);
}
但是這個時間複雜度稍差,需要O((n+m)log(n+m)),畢竟在這裏沒有利用兩個數組本身已經有序這個特點來搞。
接下來用的是參考了https://juejin.im/post/5bee5089e51d4538670b00d7其他的方法,我參考了掘金上這個【程序員喬戈裏】的方法,使用了雙指針的做法,還是蠻讚的。
這裏我提一句,其實力扣裏有一個官方解答,但是我運行起來的時候,一直都是報錯的,尤其是方法二和方法三,不知道是我的方法不對,還是程序本身就是問題,我把地址附上,小夥伴們有興趣的,可以看下,告訴我答案哦。
地址如下:https://leetcode-cn.com/problems/merge-sorted-array/solution/he-bing-liang-ge-you-xu-shu-zu-by-leetcode/
本來思路挺好的,用了雙指針從前往後和從後往前,可惜跑不起來。但也是奇怪,放進去審覈,又是可以通過的,我有點懷疑自己了,哈哈。
public static void merge1(int[] nums1, int m, int[] nums2, int n) { int[] result = new int[m+n]; int i = 0,j = 0,p=0; while (i < m && j < n) { if (nums1[i] < nums2[j]) { result[p++] = nums1[i++]; } else { result[p++] = nums2[j++]; } } if (i != m) { while (i < m) { result[p++] = nums1[i++]; } } if (j != n) { while (j < n) { result[p++] = nums2[j++]; } } p = 0; for(i = 0; i< nums1.length;i++) { nums1[i] = result[p++]; }}
int[] result = new int[m+n];
int i = 0,j = 0,p=0;
while (i < m && j < n) {
if (nums1[i] < nums2[j]) {
result[p++] = nums1[i++];
} else {
result[p++] = nums2[j++];
}
}
if (i != m) {
while (i < m) {
result[p++] = nums1[i++];
}
}
if (j != n) {
while (j < n) {
result[p++] = nums2[j++];
}
}
p = 0;
for(i = 0; i< nums1.length;i++) {
nums1[i] = result[p++];
}
}
Review 閱讀並點評至少一篇英文文章
Android Studio Project Marble: Layout Editor
(https://medium.com/androiddevelopers/android-studio-project-marble-layout-editor-608b6704957a)
好像連續幾周看的都是程序員如何提升自身能力方面的話題,沒有像以前一樣,分享技術相關的,這次,我又找了篇關於Android Studio 佈局編輯器相關的給大家,希望大家能喜歡。
這是 Android Studio 團隊發佈的一系列博客文章中的第五篇,這些博客文章深入探討了 Project Marble 的一些細節和幕後故事。(感覺我可以把這五篇都看完,也可以整理成一個系列來分享了)
文中介紹了開發人員在Project Marble 期間進行了以下六大優化佈局編輯器:
並對每一個資源進行了詳細的介紹。所以,這裏我沒法一一解答,給大家一箇中文翻譯的地址,是我在掘金上看到的,還是蠻好的哦。
【譯】Android Studio Project Marble:佈局編輯器
(https://juejin.im/post/5d24b7ce6fb9a07ef7109a6c#heading-4)
昨天,和一位老哥聊了聊,還是堅定了我學習Java和Android到底的決心,所以後續我會更多的往這方面的資料分享,提前祝大家週末愉快。
Tip 一個技術技巧
這次分享的是網絡優化中的第三篇,這裏更新完,後續我找找其他資源了要
移動端監控
如何監控網絡
第一種方法:插樁
爲了兼容性考慮,首先想到的還是插樁。360開源的性能監控工具ArgusAPM就是利用Aspect切換插樁,實現監控系統和OkHttp網絡庫的請求。
第二種方法:Native Hook
網絡相關的我們一般會Hook下面幾個方法:
第三種方法:統一網絡庫
如何監控流量
應用流量監控的方法非常簡單,一般通過TrafficStats類。
iPhone 的無線網絡助理、小米和一加的自適應 WLAN它們在檢測 WiFi 不穩定時會自動切換到移動網絡。那請你思考一下,它們是如何實現偵測,如何區分是應用後臺服務器出問題還是 WiFi 本身有問題呢?
對於手機廠商來說根本不需要訪問一個公網IP的方式,它在底層可以拿到的信息有很多。
大網絡平臺監控
客戶端監控
接入層監控
接入層的數據監控還是非常有必要的,主要的原因是:
接入層應該關心哪些數據呢?一般來說,會比較關心服務的入口和出口流量、服務端的處理時延、錯誤率等。
監控報警
總結
監控、監控又是監控,很多性能優化工作其實都是“三分靠優化,七分靠監控”。
我們在工作的時候,希望你可以看得更遠,從更高的角度去思考問題。多想想如果我能做好這件事情,怎麼保證其他人不會犯錯,或者讓所有人都可以做得更好。
Share 一篇有觀點和思考的技術文章
後續還是繼續更新設計模式相關文章哦。
公衆號地址:
設計模式之單例模式(一)