1. 程式人生 > 實用技巧 >ARTS習慣(6)

ARTS習慣(6)

目錄

Algorithm

每週至少做一個Leetcode演算法題

第1道


【題目來源】

T8:旋轉陣列的最小數字,何海濤《劍指Offer》

【題目】

把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入一個遞增排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。

例子

例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。

【解答】

本題若讀者給出順序遍歷的方案,複雜度為O(N),顯然沒有用到旋轉陣列的特性,不會是最優解

注意到有序陣列這一條件,利用二分查詢寫出O(logN)的解法才是面試官想要的

步驟

【參考程式碼】

package com.pengluo.hht_offer.T08_RotateArray;

public class GetMinInRotateArray {
    /**
     *  解法1:遍歷陣列,逐一比較
     * @param arr
     */
    public int getMinInRotate1(int[] arr) {
        if (arr == null || arr.length ==0) {
            return -1;
        }
        for (int i=0; i < arr.length; i++) {
            if (arr[i] > arr[i+1]){
                return arr[i+1];
            }
        }
    }

    /**
     *  解法2:二分查詢
     * @param arr
     * @return arr[mid]最小值
     */
    public int getMinInRotate2(int[] arr) {

        if (arr == null || arr.length ==0) {
            return -1;
        }

        int left = 0;
        int right = arr.length - 1;
        int mid = left;
        while (arr[left] >= arr[right] ) {
            //
            if ( 1 == right - left) {
                mid = right;
                break;
            }
            mid = (left + right)/2;
            // arr[left]=arr[mid]=arr[right]的特殊情形,單獨處理,因為二分查詢不能判定mid屬於哪個遞增陣列
            if (arr[left] == arr[right] && arr[left] == arr[mid]) {
                return minInOrder(arr,left,right);
            }
            // 中間位置在左邊遞增陣列
            if (arr[mid] >= arr[left]) {
                left = mid;
            } else if (arr[mid] <= arr[right]) {// 中間位置在右邊遞增陣列
                right = mid;
            }

        }
        return arr[mid];
    }
    // 順序查詢
    private int minInOrder(int[] arr,int left, int right) {
        int result = arr[left];
        for (int i = left +1; i <= right; i++) {
            if (result > arr[i]) {
                result = arr[i];
            }
        }
        return result;
    }

}

思考

Review

閱讀並點評至少1篇英文技術文章

【原文】:Jeff Atwood The Problem With Logging

【譯文】:

打日誌確實有某種迷人的吸引力。為什麼不盡可能多的打日誌呢?而且打日誌對定位問題有好處,那麼到處打日誌,有什麼壞處呢?

似乎打日誌沒有什麼壞處,但其實可能以你嚴重的損害,舉個例子看看

在高負載情形下,一個經典的死鎖產生。我不保證你在一個輕負載的App上能看到它,但是在我們的網站平均一天一次的發生它。

我不怪log4net日誌框架,我認為是我們寫的垃圾程式碼負全責。後來我們花費了數天定位這些死鎖,......。呼叫了很多資源,花了很大代價,最後我們確定罪魁禍首:日誌策略。

多麼諷刺!

我從來就不是一個典型的打日誌的超級粉絲

  1. 打日誌意味著更多的程式碼

  2. 打日誌並不免費

    日誌框架雖然高效,但不是無限快。打日誌帶來效能開銷和增加額外的時間

  3. 如果值得儲存到日誌檔案,值得在使用者接口出現

  4. 日誌用的越多,你能找到的東西越小

    GB的日誌資料太多了,需要花費巨大的腦力處理

  5. 日誌檔案

看到這裡,你可能會得出”打日誌就是浪費時間“的結論。其實我不是反對打日誌,我是反對過度的打日誌。

我們已經從 Stack Overflow移除所有的日誌,除了依靠exception日誌。老實說,我根本沒有想念過它在這之後。

當談到打日誌,正確的答案不是”對,總是儘可能的多使用“。抵制給一切打日誌的想法。簡單和小範圍使用,在大多數顯而易見的嚴重的錯誤時用日誌,確實需要時才使用。

【點評】:

作者Jeff Atwood是程式設計師大牛,Stack Overflow的創始人,認為日誌很有吸引力,可以幫助定位問題,但問題和優點一樣也很明顯,過度的使用會產生很多問題:包括產生冗餘的程式碼,效能的消耗。只有在必須要使用日誌的重要場合才建議使用日誌,反對過度的使用日誌。

Tip

學習至少一個技術技巧

重灌win10及Java開發環境

  1. 重灌win10系統

    • 重灌系統之前,做好資料的備份,硬碟和雲盤都可以,硬碟更快,因此我採用的硬碟
    • PE U盤起系統,進入桌面(圖1)用分割槽工具將機械盤HD0和固態盤HD1刪除分割槽並格式化
    • 開機後一直按ESC鍵進入BIOS,將HD1設定為優先啟用,HD0優先順序低
    • PE U盤起系統,進入桌面點選安裝系統(在這之前,先將240G的固態盤HD1分成2個區,125G為系統盤C,其餘為普通盤D)
    • 重灌完成後,關機,拔掉U盤,開機自動,自動安裝驅動
    • 重啟,正常進入win10

    原來是win7+4G+機械硬碟,更換後是win10+8G DDR3+240G SSD,升級後跟新買的電腦樣,執行十分流暢,贊極了。

  2. jdk安裝

    • oracle官網下載jdk1.8
    • 安裝到本地磁碟,包括:jdk和jre
    • 配置環境變數,同樣包括jdk和jre
    • 測試安裝是否成功
  3. IDEA安裝

    • 下載安裝包,我的為2020.1版本
    • 按提示安裝即可
  4. Maven

    • 下載maven安裝壓縮包,解壓到本地磁碟
    • 配置環境變數,檢查版本‘
    • 新建本地倉庫資料夾maven_repository
    • 配置conf\settings中本地倉庫(標籤)、遠端映象源(標籤),將映象配置為國內的映象,會大大加快下載速度
  5. Mysql

    • 重灌系統前,最重要的是將專案的資料庫表匯出為sql,參考Mysql 一次性備份匯出/匯入恢復所有資料庫
    • 特別注意版本,作者最初裝的是latest version(8.0.22),安裝後測試與原有的專案不相容。更換為5.7.32 version工作正常
    • 從官網下載安裝壓縮包,解壓到本地磁碟D:\mysql
    • 根目錄D:\mysql\mysql-5.7.32-winx64下建立data資料夾和my.ini檔案,配置my.ini檔案
    • 管理員身份執行cmd,執行幾條指令進行安裝和系統登錄檔註冊,自行搜尋安裝教程。可參考mysql 8.0.22 安裝配置圖文教程
    • 安裝過程中,可能缺少一些檔案和元件,根據報錯資訊關鍵字搜尋解決即可
    • 設定密碼,參考mysql重置密碼
    • 匯入sql恢復資料庫表:mysql>source f:\sqlback.sql;
    • 配置完成,正常使用資料庫
  6. 其它軟體安裝

    以下軟體安裝都比較簡單,按提示操作很簡單

    • 檔案管理軟體:Total commander
    • markdown編輯器:Typora
    • 版本控制軟體:Git
    • IDE:vs Code
    • 包管理:node.js V10.0.0
    • web測試工具:postman

孔子說,工欲善其事,必先利其器。此刻,這句名言最能概括我此時的感受。原本我這段時間很忙,擔心重灌系統及配置環境會耽誤太長的時間影響我目前的開發,猶豫了很久。現在看來電腦執行速度提升帶來的開發效率提升了20倍以上,為自己的果斷決策鼓掌。

Share

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

從0開始學習 GitHub 系列之「團隊合作利器 Branch」

米羅說

  • 掌握時間管理是每個人的必修課

  • 總有人比你NB,還比你更拼命-stormzhang