Dimple在左耳聽風ARTS打卡(十六)
- 2019 年 12 月 26 日
- 筆記
所謂ARTS:每周至少做一個LeetCode的演算法題;閱讀並點評至少一篇英文技術文章;學習至少一個技術技巧;分享一篇有觀點和思考的技術文章。(也就是Algorithm、Review、Tip、Share 簡稱ARTS)這是第十六期打卡。
寫作課已經進行到一半了,還是那句話,適合自己的才是最好的。或許寫作課對有些人來說是好的,也可能對有些人來說是不需要付出的,這個還需要看每個人的想法,想走的路子,適合自己的才是最好的哦。
Algorithm LeetCode演算法
合併兩個有序數組 (https://leetcode-cn.com/problems/merge-sorted-array/)
題目描述:給定兩個有序整數數組 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序數組。
說明:
- 初始化 nums1 和 nums2 的元素數量分別為m 和 n。
- 你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來保存 nums2 中的元素。
示例 1:
輸入: 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); }
但是這個時間複雜度稍差,需要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++]; } }
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下面幾個方法:
- 連接相關:connect
- 發送數據相關:send和sendto
- 接收數據相關:recv和recvfrom
第三種方法:統一網路庫
- 如何監控流量 應用流量監控的方法非常簡單,一般通過TrafficStats類。
iPhone 的無線網路助理、小米和一加的自適應 WLAN它們在檢測 WiFi 不穩定時會自動切換到移動網路。那請你思考一下,它們是如何實現偵測,如何區分是應用後台伺服器出問題還是 WiFi 本身有問題呢?
對於手機廠商來說根本不需要訪問一個公網IP的方式,它在底層可以拿到的資訊有很多。
- 網卡驅動層資訊。如射頻參數,可以用來判斷WiFi的訊號強度;網卡數據包隊列長度,可以用來判斷網路是否擁塞
- 協議棧資訊。主要是獲取數據包發送、接收、時延和丟包等資訊
大網路平台監控
- 客戶端監控
- 接入層監控
接入層的數據監控還是非常有必要的,主要的原因是:
- 實時性。
- 可靠性。
接入層應該關心哪些數據呢?一般來說,會比較關心服務的入口和出口流量、服務端的處理時延、錯誤率等。
- 監控報警
- 實時監控。實時監控的目的是最快速度的發現問題
- 離線監控。小時或者天級別的監控我們可以擴展出全部的維度來做監控,它的目的是在監控的同時,可以更好地圈出問題的範圍。
總結
監控、監控又是監控,很多性能優化工作其實都是「三分靠優化,七分靠監控」。
我們在工作的時候,希望你可以看得更遠,從更高的角度去思考問題。多想想如果我能做好這件事情,怎麼保證其他人不會犯錯,或者讓所有人都可以做得更好。
愛生活,愛學習,愛感悟,愛挨踢