- Algorithm。主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。关于做Leetcode的的优势,你可以看一下我在coolshell上的文章 Leetcode 编程训练 - 酷 壳 - CoolShell。
- Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。所以,需要你阅读并点评至少一篇英文技术文章,我个人最喜欢去的地方是http://Medium.com(需要梯子)以及各个公司的技术blog,如Netflix的。
- Tip:主要是为了总结和归纳你在是常工作中所遇到的知识点。学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识。
- Share:主要是为了建立你的影响力,能够输出价值观。分享一篇有观点和思考的技术文章
Algorithm 算法
x 的平方根
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
方法一
public static int mySqrt1(int x) {
int maxValue = Integer.MAX_VALUE;
for (int i = 0; i < maxValue; i++) {
System.out.println(i*i);
if (x == i * i) {
return i;
} else if (x < i * i ) {
return i-1;
}
}
return 0;
}
失败:直接就超时了
方法二:二分查找法(之前没考虑过,乘法都可以使用二分查找法)
public static int mySqrt2(int x) {
if (x ==0 || x == 1) {
return x;
}
int low = 0 ;
int high = x;
while (high >= low) {
int middle = (low + high)/2;
if (x > middle * middle) {
middle++;
if (x < middle * middle) {
return middle - 1;
}
low = middle -1;
} else if (x < middle * middle) {
high = middle + 1;
} else if (x == middle * middle) {
return middle;
}
}
return 0;
}
这种方式如果传入的x过大,比如1000000,最后的结果会有误,因为取middle的时候,middle * middle的结果可能大于int的最大值,可是依旧使用int接收,会导致溢出,比如458753*458753的结果是917505,导致结果出错。
所以最后使用long来进行接收
public static int mySqrt(int x) {
if (x ==0 || x == 1) {
return x;
}
long low = 0 ;
long high = x;
while (high >= low) {
long middle = (low + high)/2;
if (x > middle * middle) {
middle++;
if (x < middle * middle) {
return (int)middle - 1;
}
low = (int)middle -1;
} else if (x < middle * middle) {
high = middle + 1;
} else if (x == middle * middle) {
return (int)middle;
}
}
return 0;
}
Review 回顾
暂无
Tip 知识点
java数组元素默认值
- byte,short,int,long类型定义的数组,初始化默认是0
- float、double类型定义的数组,默认值是0.0
- String类型定义的数组,默认值是null
- char类型定义的数组,默认值是‘0’('\u0000')
- boolean类型定义的数组,默认值是false
Share分享
极客时间-SQL必知必会
是否使用外键
是否使用外键确实会有一些争议。
首先,外键本身是为了实现强一致性,所以如果需要正确性 > 性能的话,还是建议使用外键,它可以让我们在数据库的层面保证数据的完整性和一致性。
当然不用外键,你也可以在业务层进行实现。不过,这样做也同样存在一定的风险,因为这样,就会让业务逻辑会与数据具备一定的耦合性。也就是业务逻辑和数据必须同时修改。而且在工作中,业务层可能会经常发生变化。
当然,很多互联网的公司,尤其是超大型的数据应用场景,大量的插入,更新和删除在外键的约束下会降低性能,同时数据库在水平拆分和分库的情况下,数据库端也做不到执行外键约束。另外,在高并发的情况下,外键的存在也会造成额外的开销。因为每次更新数据,都需要检查另外一张表的数据,也容易造成死锁。
所以在这种情况下,尤其是大型项目中后期,可以采用业务层来实现,取消外键提高效率。
不过在SQL学习,以及项目早期,还是建议你使用外键。在项目后期,你可以分析有哪些外键造成了过多的性能消耗。一般遵循2/8原则,会有20%的外键造成80%的资源效率,你可以只把这20%的外键进行开放,采用业务层逻辑来进行实现,当然你需要保证业务层的实现没有错误。不同阶段,考虑的问题不同。当用户和业务量增大的时候,对于大型互联网应用,也会通过减少外键的使用,来减低死锁发生的概率,提高并发处理能力。