ARTS是什么? Algorithm:每周至少做一个LeetCode的算法题 Review:阅读并点评至少一篇英文技术文章 Tip:学习至少一个技术技巧,总结和归纳日常工作中遇到的知识点 Share:分享一篇有观点和思考的技术文章
Algorithm
完成动态规划的相关题目
/**
* 0-1背包问题
* 我们有一个背包,背包总的承载重量是 Wkg。现在我们有 n 个物品,每个物品的重量不等,并且不可分割。
* 我们现在期望选择几件物品,装载到背包中。在不超过背包所能装载重量的前提下,如何让背包中物品的总重量最大?
*
* 动态规划
* @author ohYoung
* @date 2021/12/2 23:03
*/
public class MyZero2OneBagDynamic {
/**
* 存储背包中物品总量的最大值
*/
public int maxWeight = Integer.MIN_VALUE;
/**
* 动态规划的方式实现0-1背包问题
* @param weight 物品重量
* @param totalCount 物品个数
* @param maxWeight 背包总承重
* @return 能放入背包的最大总重量
*/
public int knapsack(int[] weight, int totalCount, int maxWeight) {
boolean[][] states = new boolean[totalCount][maxWeight + 1];
// 第一行特殊处理
// 第一个物品不加入背包
states[0][0] = true;
// 第一个物品加入背包
if (weight[0] <= maxWeight) {
states[0][weight[0]] = true;
}
// 动态规划转移, 第一行已处理, i从1开始
for (int i = 1; i < totalCount; i++) {
// 第i行不放入背包
for (int j = 0; j <= maxWeight; j++) {
if (states[i - 1][j]) {
states[i][j] = true;
}
}
// 第i行放入背包
for (int j = 0; j <= maxWeight - weight[i]; j++) {
if (states[i - 1][j]) {
states[i][j + weight[i]] = true;
}
}
}
// 输出结果
for (int i = maxWeight; i > 0; i--) {
if (states[totalCount - 1][i]) {
return i;
}
}
return 0;
}
/**
* knapsack方法需要一个totalCount*(maxWeight+1)大小的数组, 这个方法主要优化这个空间消耗
*/
public int knapsack2(int[] weight, int totalCount, int maxWeight) {
boolean[] states = new boolean[maxWeight + 1];
states[0] = true;
if (weight[0] < maxWeight) {
states[weight[0]] = true;
}
// 动态规划
for (int i = 0; i < totalCount; i++) {
// 把第i个物品放入背包
for (int j = maxWeight - weight[i]; j >= 0; j--) {
if (states[i]) {
states[j + weight[i]] = true;
}
}
}
// 输出结果
for (int i = maxWeight; i >= 0; i--) {
if (states[i]) {
return i;
}
}
return 0;
}
public static void main(String[] args) {
MyZero2OneBagDynamic example = new MyZero2OneBagDynamic();
int[] items = new int[]{1, 4, 7};
System.out.println(example.knapsack(items, items.length, 10));
}
}
Review
What’s New in IntelliJ IDEA 2021.3
IDEA 2021.3推出的新功能:
- 支持远程开发功能(测试版本)
- 当你感觉的IDE出问题的时候可以通过File->Repair IDE按钮快速修复IDE的问题
- 新增选项,允许同时修改活动窗口的字体大小(Preferences/ Settings | Editor | General, choose Change font size with Command + mouse wheel in, and select All editors)
- 现在的提示视图更加清晰,会更加清楚的提示你当前操作带来的结果是什么
- markdown体验提升,比如现在可以更加方便的添加表格了
- 右上角新增【三个点】按钮,点击可以选择一些快捷操作
- 关于Java的更新
- 支持追踪不安全的字符串参数的检查,其他新的检查:例如提示将collect(toList())改为.toList()
- 重构升级,例如:我们现在在提取公共变量的同时可以选择将变量置为final
- 支持自定义run/debug的类路径
Tip
- DDD中有两个概念聚合和组合。我理解其最大的区别是聚合可以拆开,实体各自不受影响。但是组合不行,拆开就不能单独运转了。例如,房屋有分期、分区、楼栋的概念,但是房屋没有分期、分区或楼栋也是能玩的,这些概念实体是可以单独运转的,它们是聚合关系。但是一辆车的实体比如车轮、发动机等,就不可以运转了,这就是组合关系。
- 《中台架构与实现》中要求微服务内使用事件总线(异步)的方式进行解耦,微服务之间用中间件的方式进行解耦。个人认为太绝对,不同的业务场景完全可以使用更加简洁的办法,例如我的业务不需要异步提高效率,那么我就可以使用观察者模式同步调用事件。这样我的代码解耦了,同时页不需要考虑异步情况下的数据补偿机制。
Share
DDD建模工作坊指南
这里介绍了大量DDD相关的概念以及如何开展事件风暴。是入门DDD极好的资料。Finish
预计完成时间:2021.12.06 ~ 2021.12.12
实际完成时间:2021.12.09