Arts 第十二週(6/3 ~ 6/9)

ARTS是什麼?
Algorithm:每週至少作一個leetcode的算法題;
Review:閱讀並點評至少一篇英文技術文章;
Tip:學習至少一個技術技巧;
Share:分享一篇有觀點和思考的技術文章。java


Algorithm

LeetCode 115. Distinct Subsequencesnode

思路分析
程序員

題目的意思是求出一個字符串(子串)在另外一個字符串(主串)的子序列中出現的次數,再換個說法,主串中有多少子序列是等於子串的。一個字符串匹配問題,咱們固然能夠考慮到暴力求解,思路大概就是,咱們假設主串長度是 n,子串長度是 m,咱們在主串中選出全部的長度爲 m 的子序列,看這些子序列有多少是等於子串的,這樣的話時間複雜度是很高的,其實就是組合問題的時間複雜度,是指數級別的。因而要考慮動態規劃,基本上和字符串匹配相關的題目均可以考慮試着畫畫表格,這道題拿到手我一開始想到要用動歸,狀態的定義也不是太難,就是 dp[i][j] -> 子問題 s[0...i], t[0...j] 的答案,可是這個遞推方程想了挺久的,由於想不出來還不停地試着從新定義狀態,最後畫表格總結規律,慢慢地就出來了;通常這樣的字符串匹配問題,對於當前的問題,也就是 dp[i][j],咱們能夠去觀察相鄰的子問題 dp[i - 1][j - 1], dp[i][j - 1], dp[i - 1][j],字符串匹配問題,咱們是一個個字符對比考慮,所以這裏也只會有兩種狀況,當前比較的字符相等和當前比較的字符不相等,若是說相等,s[i] == t[j],這時咱們須要考慮的子問題是 s[0...i-1], t[0...j-1],對於這個子問題的答案咱們已經計算過了,是 dp[i - 1][j - 1],可是這尚未完,這隻能算是一部分答案,還須要考慮的子問題是 s[0...i-1], t[0...j],也就是去掉當前 s 中的字符 s[i],答案也已經計算過了,就是 dp[i][j - 1],不少人可能會問,這麼考慮會不會重複?其實不會,由於全部的當前問題不會去考慮子問題 s[0...i], t[0...j-1],也就會保證考慮的子問題不會重複,這麼說可能很差理解,畫個表格就會更好理解。若是說不相等,s[i] != t[j],這時咱們須要考慮的子問題就是 s[0...i-1], t[0,...j],直接點說就是,去掉主串當前考慮範圍中的當前字符的解。算法


參考代碼編程

public int numDistinct(String s, String t) {
    if (s == null || t == null || s.length() < t.length()) {
        return 0;
    }
    
    if (s.length() == 0 || t.length() == 0) {
        return 1;
    }
    
    char[] sArr = s.toCharArray();
    char[] tArr = t.toCharArray();
    
    // dp[i][j] -> answer for subproblem: s[0...i] and t[0...j]
    
    // if s[i] == t[j] -> dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
    // dp[i - 1][j - 1] means the count not consider s[i], which is s[0...i-1] match t[0...j-1]
    // dp[i][j - 1] means the count consider s[i], which is s[0...i] match t[0...j-1]
    
    // if t[i] != s[j] -> dp[i][j] = dp[i][j - 1]
    int[][] dp = new int[sArr.length][tArr.length];
    
    dp[0][0] = (sArr[0] == tArr[0] ? 1 : 0);
    for (int i = 1; i < sArr.length; ++i) {
        for (int j = 0; j < Math.min(i + 1, tArr.length); ++j) {
            if (sArr[i] == tArr[j]) {
                dp[i][j] = (j == 0 ? dp[i - 1][j] + 1 : dp[i - 1][j] + dp[i - 1][j - 1]);
            } else {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }
    
    return dp[sArr.length - 1][tArr.length - 1];
}
複製代碼

Review

兩篇出於同一做者,觀點鮮明,卓有見地的文章,講的是編程當中的誤區:
數組

The Greatest Developer Fallacy Or The Wisest Words You’ll Ever Hear?緩存

On The Value Of Fundamentals In Software Developmentbash

第一篇文章講的是程序員耳熟能詳的一句話 「我在須要的時候再去學習」,這句話本是沒有錯,由於計算機軟件這個領域新技術層出不窮,不可能都學完,並且爲了學習去學習也沒有意義。可是如今的問題是,不少程序員把這句話當成了不去深刻專研和挖掘知識的藉口,做者還給出了一個觀點 「你不可能去學習你徹底不知道的東西」,怎麼理解?假如說你只知道 Java Spring 這一個 Web 的框架,當你須要構建 Web 服務器的時候,你只會去考慮用 Java Spring,可是實際上,除了這個,還有 Python 的 Django,JavaScript 的 Express,Ruby 的 Ruby On Rails,這些都是 Web 框架,但它們適用於的場景不一樣,上手難度不一樣,適合解決的問題也不同,相對於 Java Spring,這些技術知識都是你不怎麼了解,也不知道其優缺點,即便它們再好,對你來講也等同於無。做者提出咱們應該成爲一個 T 型人才,他同時也指出當你去深刻專研某個方向的時候,你會連帶學到這個方向以外的不少東西,因此問題的解決方案就是,對於你感興趣的東西,你要學的更深刻些,不要學在表面,固然相對於知識的積累,更重要的是對這個行業的熱情,絕大多數的學習到最後是否有成效和收穫都會歸結爲態度問題服務器

第二篇文章講的是基礎知識的學習,做者給出了基礎的定義,一個是從宏觀來看,另外一個是從微觀來看,從宏觀上來看,好比數據結構和算法,操做系統,網絡協議的知識,之因此是宏觀上的,是由於這些東西每每是普適的,任何的技術都會基於此,舉個例子,不論是 Java 中的 ArrayList,仍是 C++ 中的 Vector,Python 中的 list,JavaScript 中的 list,這些東西本質都是動態數組,只是表示的方式不同,你若是理解了數據結構和算法中的動態數組的相關知識和由來,這些你會學的很快,使用也會駕輕就熟,其餘相關知識也同樣。微觀之因此是微觀,是由於其落實到具體技術,好比對於 Java 的 ArrayList 的學習,你須要去熟悉相關的 API 文檔,瞭解並熟練掌握其各類的常見 API 函數和相關的操做,這些東西能夠幫咱們快速寫代碼,有時候不知道一個 API 或者內置函數,每每會大大影響咱們開發的效率。因此總結下就是宏觀上的基礎學習可以讓你學的更快,微觀上面的基礎的學習會讓你實現,寫代碼的效率更快,同時對比不一樣技術之間的差別,達到舉一反三的效果網絡


Tip

分享一個 Linux 上面掛載程序的指令,screen 命令,使用起來特別簡單,通常步驟以下:

>$ screen  
按 enter 鍵
>$ node ...      (這裏輸入命令)
ctr + A          (掛載)
ctr + D          (退出)
複製代碼

這周看極客上面的 HTTP 專欄,學習了一些網絡的概念,以前徹底不知道,但又頻繁見到的一些詞彙如今有了概念了,算是掃盲吧,記錄一下,鞏固一下:

  • WWW 萬維網是互聯網的一個子集,它基於 HTTP 協議,傳輸 HTML 超文本資源
  • CDN(Content Delivery Network),是客戶端到服務器中間的一個部分,應用了 HTTP 中的緩存和代理技術,代替源站響應客戶端的請求
  • RPC(Remote Procedure Call),遠程過程調用,是一個計算機協議,容許一個計算機調用另外一個計算機上的子程序,而程序員無需額外爲這個操做編程
  • HTTPS 是運行在 SSL/TLS 上的 HTTP,TLS(Transport Layer Security)是由 SSL(Secure Socket Layer)發展過來的,運用了不少加密算法
  • IP 協議主要解決尋址和路由問題,TCP 協議是創建在 IP 之上,基於 IP 協議,提供可靠的字節流形式的通訊
  • 正向代理是指客戶端這邊的代理,反向代理是指服務器端的代理

Share

這周讀了《清醒思考的藝術》這本書,書中給出了 52 個思惟誤區,我覺的有些誤區對於咱們這些程序員,或者說是想成就一番事業的人士很是有借鑑意義

學習中的典型思惟誤區總結

相關文章
相關標籤/搜索