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 一個技術技巧

這次分享的是網路優化中的第三篇,這裡更新完,後續我找找其他資源了要

移動端監控

  1. 如何監控網路

第一種方法:插樁

為了兼容性考慮,首先想到的還是插樁。360開源的性能監控工具ArgusAPM就是利用Aspect切換插樁,實現監控系統和OkHttp網路庫的請求。

第二種方法:Native Hook

網路相關的我們一般會Hook下面幾個方法:

  • 連接相關:connect
  • 發送數據相關:send和sendto
  • 接收數據相關:recv和recvfrom

第三種方法:統一網路庫

  1. 如何監控流量 應用流量監控的方法非常簡單,一般通過TrafficStats類。

iPhone 的無線網路助理、小米和一加的自適應 WLAN它們在檢測 WiFi 不穩定時會自動切換到移動網路。那請你思考一下,它們是如何實現偵測,如何區分是應用後台伺服器出問題還是 WiFi 本身有問題呢

對於手機廠商來說根本不需要訪問一個公網IP的方式,它在底層可以拿到的資訊有很多。

  • 網卡驅動層資訊。如射頻參數,可以用來判斷WiFi的訊號強度;網卡數據包隊列長度,可以用來判斷網路是否擁塞
  • 協議棧資訊。主要是獲取數據包發送、接收、時延和丟包等資訊

大網路平台監控

  1. 客戶端監控
  2. 接入層監控

接入層的數據監控還是非常有必要的,主要的原因是:

  • 實時性。
  • 可靠性。

接入層應該關心哪些數據呢?一般來說,會比較關心服務的入口和出口流量、服務端的處理時延、錯誤率等。

  1. 監控報警
  • 實時監控。實時監控的目的是最快速度的發現問題
  • 離線監控。小時或者天級別的監控我們可以擴展出全部的維度來做監控,它的目的是在監控的同時,可以更好地圈出問題的範圍。

總結

監控、監控又是監控,很多性能優化工作其實都是「三分靠優化,七分靠監控」。

我們在工作的時候,希望你可以看得更遠,從更高的角度去思考問題。多想想如果我能做好這件事情,怎麼保證其他人不會犯錯,或者讓所有人都可以做得更好

愛生活,愛學習,愛感悟,愛挨踢

Exit mobile version