Algorithm
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
我的解法:
public static int removeDuplicates(int[] nums) {
if(nums.length <= 1){
return nums.length;
}
int index = 0;
for (int i = 1; i < nums.length ; i++) {
if(nums[index] != nums[i]){
index++;
nums[index] = nums[i];
}
}
return index + 1;
}
Review
Google Releases New Java Logging Framework
这篇文章主要介绍了谷歌发布新的Java日志框架Flogger,它的一些优点及使用示例。
- 通过对API的设计,降低了禁用日志的成本。
- 在启用的日志中有很好的性能表现
- 能满足现有的和未来的功能需求
- 在代码的可读性和扩展性上有很大改进
Tip
一个关于Springboot项目和jar包依赖的坑:添加了依赖,jar包也在对应路径的文件夹中,但在类中引用不到jar包中的方法
自己用idea根据页面正确引导创建的SpringBoot+Maven项目ProjectA,pom文件自动生成的。
对ProjectA用maven命令: clean install
,打成jar包到本地maven仓库。
这时再建立SpringBoot+Maven项目ProjectB,pom文件自动生成。在pom文件中添加对项目A的依赖。在ProjectB项目中始终调用不到ProjectA jar包中的方法。
spring-boot maven项目自动生成的pom.xml:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
相比普通的jar包,以上配置生成的jar里会多一个目录BOOT-INF,同时引用该jar包的项目会报找不到该jar包
解决方法:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
Share
这次分享的是一个有趣又有用的开源项目,一款规则引擎,刚好也在项目中用来做投资风险分析系统。
Drools是一款基于Java的开源规则引擎。它是用Java编写,由JBoss和红帽公司扩展支持,并实现Rete模式匹配算法的一个开源项目。
什么是规则引擎???
小明是一家互联网公司的软件工程师,他们公司为了吸引新用户经常会搞活动,小明常常为了做活动加班加点很烦躁,这不今天呀又来了一个活动需求,我们大家一起帮他看看。
活动规则是根据用户购买订单的金额给用户送相应的积分,购买的越多送的积分越多,用户可以使用积分来兑换相应的商品,我们这次活动的力度很大,肯定会吸引很多的用户参加,产品经理小王兴高采烈唾液横飞的对小明讲到。小明心想,又tm来这套,这次需求又要变更多少次呢?表面上还的配合,说赶紧把规则给我们吧,早点开发早点上线,小王说这次需求老简单啦,估计你们两个小时就搞定了,不信你看需求文档。
用户购买的金额和对应送多少积分的规则如下:
- 100元以下, 不加分
- 100元-500元,加100分
- 500元-1000元,加500分
- 1000元 以上,加1000分
小明一看,这需求果然简单呀,作为一个工作了两三年的程序员来讲,这不就是小case,半天搞定,送积分的代码如下:
public void execute() throws Exception { List<Order> orderList = getInitData(); for (int i=0; i<orderList.size(); i++){ Order order = orderList.get(i); if (order.getAmout() <= 100){ order.setScore(0); addScore(order); }else if(order.getAmout() > 100 && order.getAmout() <= 500){ order.setScore(100); addScore(order); }else if(order.getAmout() > 500 && order.getAmout() <= 1000){ order.setScore(500); addScore(order); }else{ order.setScore(1000); addScore(order); } } }
上线运行了半天之后,财务部的小财突然监测到活动账户的金额大为减少,发现产品做活动竟然没有通知到他,非常不爽,于是给领导小马说,这样大规模的活动,对公司财务有压力,领导小马权衡了一番说,这样吧活动继续,但是金额翻倍在送积分,于是规则变成了这样:200元以下不给积分,1000元以下给100积分...
小明看领导都发话了,没办法改呀,不过也简单,就是将里面的值都翻了倍,在投产上去,只是挨了不少测试的白眼。
活动又进行了一天,运营人员通过后台监控发现提到2倍以后,用户积极性变的很差,活动效果不理想,和领导商议了一下,改为最初规则的1.5倍,及150元一下不给积分,750元以下给给100积分... 小明这时候的心情大概是这样子的,一万个下图动物狂奔而过。
没办法还的改不是,当然这次小明可学乖了,将这些数据(多少元送多少分)存到了数据库中,当老板在改主意的时候,只要改一下数据库的值就可以了,小明为自己的明聪感到有点小高兴。
核心代码变成了这样:
public void execute() throws Exception { List<Order> orderList = getInitData(); List<int> values = getTableValues(); for (int i=0; i<orderList.size(); i++){ Order order = orderList.get(i); if (order.getAmout() <= values.get(0)){ order.setScore(values.get(3)); addScore(order); }else if(order.getAmout() > values.get(0) && order.getAmout() <= values.get(1)){ order.setScore(values.get(4)); addScore(order); }else if(order.getAmout() > values.get(1) && order.getAmout() <= values.get(2)){ order.setScore(values.get(5)); addScore(order); }else{ order.setScore(values.get(6)); addScore(order); } } }
正当小明得意洋洋的打个了最新版本投产上线之后,产品经理小王说积分规则层次太少了,由以前的4组变成8组,小明此刻的心情:kao ...
小明想这样下去非得被他们弄死,必须要找找有什么技术可以将活动规则和代码解耦,不管规则如何变化,执行端不用动。小明搜了半天还真有这样的东西,那就是规则引擎,那么规则引擎到底是什么东西呢?
规则引擎介绍
规则引擎起源于基于规则的专家系统,而基于规则的专家系统又是专家系统的其中一个分支。利用它可以在应用系统中分离商业决策者的商业决策逻辑和应用开发者的技术决策,并把这些商业决策放在中心数据库或其他统一的地方,让它们能在运行时可以动态地管理和修改,从而为企业保持灵活性和竞争力提供有效的技术支持。
java开源的规则引擎有:Drools、Easy Rules、Mandarax、IBM ILOG。使用最为广泛并且开源的是Drools。
gui
声明式编程
规则可以很容易地解决困难的问题,并得到解决方案的验证。与代码不同,规则以较不复杂的语言编写; 业务分析师可以轻松阅读和验证一套规则。逻辑和数据分离
数据位于“域对象”中,业务逻辑位于“规则”中。根据项目的种类,这种分离是非常有利的。速度和可扩展性
写入Drools的Rete OO算法已经是一个成熟的算法。在Drools的帮助下,您的应用程序变得非常可扩展。如果频繁更改请求,可以添加新规则,而无需修改现有规则。知识集中化
通过使用规则,您创建一个可执行的知识库(知识库)。这是商业政策的一个真理点。理想情况下,规则是可读的,它们也可以用作文档。
参考链接:
小明历险记:规则引擎Drools教程详解
深入了解Drools
Drools Documentation
易百教程:Drools