Monthly Archive: April 2020

算法練習 Leetcode 力扣 518. Coin Change 2解法

作為lc322 coin change的follow up,leetcode標記為medium,而且acceptance rate為47%,高於coin change的34.2%。個人做下來覺得很難,比322要難。寫出一個邏輯正確的解法還算OK,但是OJ會超時。 Python 版本 top down dfs + backtrace Python 版本 bottom up dp 以上兩種都超時。 實在想不到能過OJ的算法,以下dp算法也是我從網上大神們那學到了。盯着看了2天才算想明白了其中道理。寫得非常簡短。

算法練習 Leetcode 力扣 322. Coin Change 解法

leetcode 322 coin change

題目在這裡。 自己想的答案,bottom up dp不太好想,從top down + cache開始,寫了幾次,每次簡化一點,最終寫成這樣通過OJ。 Python 版本。 為了更好理解算法,加了些log,記錄dfs被call了幾次和cache hit,和每個cache key被寫入次數(使用cache和不用cache的情況。 用coins = [1, 2, 5]和amount = 11為例子 用了cache 不用cache 運行完後cache的內容如下 正是從0到11每個amount的最少硬幣數。從此出發,想到bottom up dp正是需要構建如上cache的內容。dp[0] = 0,amount是0,當然一個硬幣不用。dp[amount]就看amount – coin值是不是正,而且之前是否有非-1的值。當算到amount的時候,前面dp[0]到d][amount-coin]都算過了。對所有的coin值都算一遍,把所有dp[amount – coin]的非-1最小值找出來,加1,就是dp[amount]。時間複雜度為O(amount * len(coins))。空間為 O(amount)。 過了多日以後自己重新想的Python寫法, 看看是否已經內化並掌握. 對比上面, 做了一些改進, dp list…
Read more

怎樣用gradle建立一個新的Java項目 | how to create a new Java project using gradle

Gradle是什麼? Gradle是Java的build tool,是maven, ant的後代產品。Gradle也是是現在Android的默認build tool。Gradle由Gradle公司團隊維護和開發。build.gradle是代替maven里的pom.xml的項目配置文件,其作用類似於C/C++里的Makefile。 Gradle入門 本文用Intelij Idea 2019.3.3為例子創立新的Java項目。 以上是自動生成的build.gradle文件

Java 反射入門 | A short introduction to Java reflection

反射在Java是個比較奇怪的概念,背後的思想其實很深刻。一般程序包括程序(code)和數據(data)兩部分。如果一個程序計算1+1,那麼1和1是數據,而加法這個操作是code,code是編譯時就決定的,編譯後就不能再更改,比如這裡的加法。而反射這個概念允許了data也可以是code的概念。比如現在程序變成了f(1, 1),f是一個未知函數,它也是”data”,可以由用戶提供。用戶提供了乘法,那就是乘法,提供了減法,那就是減法。這樣提供一個讓程序在運行時修改自己的機制。這樣能提高程序的表達力,一些Java的框架比如Spring就大量用到反射。Spring裏面很多magical的現象就是這樣實現的,比如我明明只寫了一個class,另一個地方我就自動有了一個這個class的object,而我明明沒有在任何地方初始化這麼一個對象。IDE裏面自動提示一個class裏面的available methods應該也是用到了reflection。在應用中有些壞處也是顯而易見,需要小心。在Java裏面reflection速度慢還是其次,IDE很難檢測到代碼被引用,還有很多compiler可以檢測到的錯誤被漏過了,只能在run time出問題。而且允許外部輸入代碼也帶來安全問題。很多網絡攻擊的原理比如SQL injection就是利用了data也是code的這種特性。關於refelection很多的用法以後我會再寫。 本文通過一個簡單的Java例子來演示一下Java的reflection。Just get a feeling. Animal.java Tiger.java Lion.java Zoo.java 運行結果 Zoo.java 為主程序。裏面的animal是什麼要看用戶提供的data決定而不是compile time決定的。在IDE裏面,都找不到Lion.java和Tiger.java的引用。因為他們是這樣被用到的:Class cls = Class.forName(className)。className還是個runtime才能知道的String,連人類都不是很容易能發現,IDE能知道就真的實現人工智能了。 雖然我本人並不是Reflection的粉絲,但是因為合作中同事可能會用到,或者公司所選的框架用到,比如Spring之類也是被廣泛使用,還是應該抱有開放的心態學習並駕馭它。 另外,本文提供的小程序程序也包含了Java從鍵盤輸入data的例子。

python 抓取ip地址的正則表達式 | Regular expression for finding ip address using Python

具體可以參考Python 正則表達式文檔。個人覺得不是很容易讀懂,只能邊用邊積累,而且一不用就忘光光。故此寫下筆記用作日後查詢。 以下解釋一下代碼。 re是python regular expression的包。re.compile是把表達式先編譯好成狀態機,如果要後面重複使用這個pattern的話會快一點。re.match第一個參數是pattern,第二個參數是string。pattern也可以用string代替。 match是從頭開始找,如果在中間可以用re.search。 \d是數字,{1,3}是一到3個。\d{1,3}是1到3個數字。\.是一個點。如果不加\,.表示任意字符。