ARTS 第61周

ARTS (第61周)

因上努力,果上随缘,但行好事,莫问前程。

Algorithm 算法

剪绳子

1
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

解法1 穷举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public int cutRope1(int target) {
if(target<4){
return target-1;
}
if(target==4){
return target;
}

return cutRope_help(target);
}

public int cutRope_help(int target) {
int curMax = 0;
if(target <=4)
return target;
for (int i = 1; i < target; i++) {
curMax =Math.max(curMax ,i*cutRope_help(target- i));
}
return curMax;
}

解法2 动态规划 1

这里是第一版本的规划 后来看了数学公式归纳出来的题解后,对这个版本做了优化

双重循环里 j<=3即可满足条件了,不需要遍历全部(解法3)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public int cutRope(int target) {
if(target<4){// 2、3的情况
return target-1;//因为要求必须分段 至少2段 所以减一
}
if(target==4){
return target;// 2*2
}
int[] dp = new int[target+1];
for (int i = 1; i < 5; i++) {
//默认值
dp[i]=i;// 这里的2、3的长度 因为是给后面做计算的 所以不用减一
}
for (int i = 5; i <= target; i++) {
for (int j = 1; j <= i ; j++) {
dp[i]=Math.max(dp[i],dp[i-j]*j);
}

}

return dp[target];
}

解法3 动态规划2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public int cutRope3(int target) {
if(target<4){// 2、3的情况
return target-1;//因为要求必须分段 至少2段 所以减一
}
if(target==4){
return target;// 2*2
}
int[] dp = new int[target+1];
for (int i = 1; i < 5; i++) {
//默认值
dp[i]=i;// 这里的2、3的长度 因为是给后面做计算的 所以不用减一
}
for (int i = 5; i <= 3; i++) {
for (int j = 1; j <=i ; j++) {
dp[i]=Math.max(dp[i],dp[i-j]*j);
}
}
return dp[target];
}

Review 英文文章

https://spring.io/guides/gs/async-method/ spring异步方法

Tip 技巧

规范-关于命名

1、命名的关键是能准确达意。对于不同作用域的命名,我们可以适当地选择不同的长度。

2、我们可以借助类的信息来简化属性、函数的命名,利用函数的信息来简化函数参数的命名。

3、命名要可读、可搜索。不要使用生僻的、不好读的英文单词来命名。命名要符合项目的统一规范,也不要用些反直觉的命名。

4、接口有两种命名方式:一种是在接口中带前缀“I”;另一种是在接口的实现类中带后缀“Impl”。对于抽象类的命名,也有两种方式,一种是带上前缀“Abstract”,一种是不带前缀。这两种命名方式都可以,关键是要在项目中统一。

规范- 关于注释

1、注释的内容主要包含这样三个方面:做什么、为什么、怎么做。对于一些复杂的类和接口,我们可能还需要写明“如何用”。

2、类和函数一定要写注释,而且要写得尽可能全面详细。函数内部的注释要相对少一些,一般都是靠好的命名、提炼函数、解释性变量、总结性注释来提高代码可读性。

规范-关于代码风格函数

1、类多大才合适?函数的代码行数不要超过一屏幕的大小,比如 50 行。类的大小限制比较难确定。

2、一行代码多长最合适?最好不要超过 IDE 的显示宽度。当然,也不能太小,否则会导致很多稍微长点的语句被折成两行,也会影响到代码的整洁,不利于阅读。

3、善用空行分割单元块。对于比较长的函数,为了让逻辑更加清晰,可以使用空行来分割各个代码块。

4、四格缩进还是两格缩进?我个人比较推荐使用两格缩进,这样可以节省空间,尤其是在代码嵌套层次比较深的情况下。不管是用两格缩进还是四格缩进,一定不要用 tab 键缩进。

5、大括号是否要另起一行?将大括号放到跟上一条语句同一行,可以节省代码行数。但是将大括号另起新的一行的方式,左右括号可以垂直对齐,哪些代码属于哪一个代码块,更加一目了然。

6、类中成员怎么排列?在 Google Java 编程规范中,依赖类按照字母序从小到大排列。类中先写成员变量后写函数。成员变量之间或函数之间,先写静态成员变量或函数,后写普通变量或函数,并且按照作用域大小依次排列。

规范-关于编码技巧

1、将复杂的逻辑提炼拆分成函数和类。

2、通过拆分成多个函数或将参数封装为对象的方式,来处理参数过多的情况。

3、函数中不要使用参数来做代码执行逻辑的控制。

4、函数设计要职责单一。

5、移除过深的嵌套层次,方法包括:去掉多余的 if 或 else 语句,使用 continue、break、return 关键字提前退出嵌套,调整执行顺序来减少嵌套,将部分嵌套逻辑抽象成函数。

6、用字面常量取代魔法数。

7、用解释性变量来解释复杂表达式,以此提高代码可读性。

规范-统一编码规范

除了这三节讲到的比较细节的知识点之外,最后,还有一条非常重要的,那就是,项目、团队,甚至公司,一定要制定统一的编码规范,并且通过 Code Review 督促执行,这对提高代码质量有立竿见影的效果。

Share 分享

https://blog.csdn.net/HD243608836/article/details/102735442 高并发其实挺容易的,当你明白了一万并发的原理,然后扩展到百万、千万、亿万级很easy

https://toutiao.io/u/123460 开发者头条

https://www.zhihu.com/question/22625187/answer/85530416?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io 微信红包的随机算法

https://blog.csdn.net/superit401/article/details/78349353 java二进制表示法

https://www.jianshu.com/p/c9a267d691e2 JUnit之TestCase和TestSuite详解