ARTS 第7周 -0617

8 篇文章 0 订阅
  • 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数组元素默认值

 

  1. byte,short,int,long类型定义的数组,初始化默认是0
  2. float、double类型定义的数组,默认值是0.0
  3. String类型定义的数组,默认值是null
  4. char类型定义的数组,默认值是‘0’('\u0000')
  5. boolean类型定义的数组,默认值是false

 

 

Share分享

极客时间-SQL必知必会

是否使用外键

是否使用外键确实会有一些争议。

 

首先,外键本身是为了实现强一致性,所以如果需要正确性 > 性能的话,还是建议使用外键,它可以让我们在数据库的层面保证数据的完整性和一致性。

 

当然不用外键,你也可以在业务层进行实现。不过,这样做也同样存在一定的风险,因为这样,就会让业务逻辑会与数据具备一定的耦合性。也就是业务逻辑和数据必须同时修改。而且在工作中,业务层可能会经常发生变化。

 

当然,很多互联网的公司,尤其是超大型的数据应用场景,大量的插入,更新和删除在外键的约束下会降低性能,同时数据库在水平拆分和分库的情况下,数据库端也做不到执行外键约束。另外,在高并发的情况下,外键的存在也会造成额外的开销。因为每次更新数据,都需要检查另外一张表的数据,也容易造成死锁。

所以在这种情况下,尤其是大型项目中后期,可以采用业务层来实现,取消外键提高效率。

 

不过在SQL学习,以及项目早期,还是建议你使用外键。在项目后期,你可以分析有哪些外键造成了过多的性能消耗。一般遵循2/8原则,会有20%的外键造成80%的资源效率,你可以只把这20%的外键进行开放,采用业务层逻辑来进行实现,当然你需要保证业务层的实现没有错误。不同阶段,考虑的问题不同。当用户和业务量增大的时候,对于大型互联网应用,也会通过减少外键的使用,来减低死锁发生的概率,提高并发处理能力。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值