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日誌框架,我認為是我們寫的垃圾程式碼負全責。後來我們花費了數天定位這些死鎖,......。呼叫了很多資源,花了很大代價,最後我們確定罪魁禍首:日誌策略。
我從來就不是一個典型的打日誌的超級粉絲
-
打日誌意味著更多的程式碼
-
打日誌並不免費
日誌框架雖然高效,但不是無限快。打日誌帶來效能開銷和增加額外的時間
-
如果值得儲存到日誌檔案,值得在使用者接口出現
-
日誌用的越多,你能找到的東西越小
GB的日誌資料太多了,需要花費巨大的腦力處理
-
日誌檔案
看到這裡,你可能會得出”打日誌就是浪費時間“的結論。其實我不是反對打日誌,我是反對過度的打日誌。
我們已經從 Stack Overflow移除所有的日誌,除了依靠exception日誌。老實說,我根本沒有想念過它在這之後。
當談到打日誌,正確的答案不是”對,總是儘可能的多使用“。抵制給一切打日誌的想法。簡單和小範圍使用,在大多數顯而易見的嚴重的錯誤時用日誌,確實需要時才使用。
【點評】:
作者Jeff Atwood是程式設計師大牛,Stack Overflow的創始人,認為日誌很有吸引力,可以幫助定位問題,但問題和優點一樣也很明顯,過度的使用會產生很多問題:包括產生冗餘的程式碼,效能的消耗。只有在必須要使用日誌的重要場合才建議使用日誌,反對過度的使用日誌。
Tip
學習至少一個技術技巧
重灌win10及Java開發環境
-
重灌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,升級後跟新買的電腦樣,執行十分流暢,贊極了。
-
jdk安裝
- oracle官網下載jdk1.8
- 安裝到本地磁碟,包括:jdk和jre
- 配置環境變數,同樣包括jdk和jre
- 測試安裝是否成功
-
IDEA安裝
- 下載安裝包,我的為2020.1版本
- 按提示安裝即可
-
Maven
- 下載maven安裝壓縮包,解壓到本地磁碟
- 配置環境變數,檢查版本‘
- 新建本地倉庫資料夾maven_repository
- 配置conf\settings中本地倉庫(
標籤)、遠端映象源( 標籤),將映象配置為國內的映象,會大大加快下載速度
-
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;
- 配置完成,正常使用資料庫
-
其它軟體安裝
以下軟體安裝都比較簡單,按提示操作很簡單
- 檔案管理軟體:Total commander
- markdown編輯器:Typora
- 版本控制軟體:Git
- IDE:vs Code
- 包管理:node.js V10.0.0
- web測試工具:postman
孔子說,工欲善其事,必先利其器。此刻,這句名言最能概括我此時的感受。原本我這段時間很忙,擔心重灌系統及配置環境會耽誤太長的時間影響我目前的開發,猶豫了很久。現在看來電腦執行速度提升帶來的開發效率提升了20倍以上,為自己的果斷決策鼓掌。
Share
分享一篇有觀點和思考的技術文章
從0開始學習 GitHub 系列之「團隊合作利器 Branch」
米羅說
-
掌握時間管理是每個人的必修課
-
總有人比你NB,還比你更拼命-stormzhang