Dimple在左耳聽風ARTS打卡(十六)

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

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

移動端監控

  1. 如何監控網絡

第一種方法:插樁

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

第二種方法:Native Hook

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

第三種方法:統一網絡庫

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

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

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

大網絡平臺監控

  1. 客戶端監控

  2. 接入層監控

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

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

  1. 監控報警

總結

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

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

Share 一篇有觀點和思考的技術文章

後續還是繼續更新設計模式相關文章哦。

公衆號地址:
設計模式之單例模式(一)

愛生活,愛學習,愛感悟,愛挨踢
640?wx_fmt=jpeg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章