Latest Posts

算法练习 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个数字。\.是一个点。如果不加\,.表示任意字符。