⚡每日算法&面试题⚡一起肥学3️⃣

165 阅读2分钟

这是我参与8月更文挑战的第30天,活动详情查看:8月更文挑战

🧝‍♂️算法题

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:

输入:x = 2.10000, n = 3
输出:9.26100
示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
提示:

-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104

🧝‍♂️一点点思路

大家有听说过快速幂吗?就是一种算法。这道题用这种算法来搞就可了。什么是快速幂呢?我们简单说一下,比如说你要计算

x^64=x*x*x....x
这样64个x相乘,这种计算方法你需要计算63

而快速幂:

x-x^2-X^4-x^8-x16-x^32-x^64
只计算了6

这就是快速幂的核心思想。下面我们来解一下这道题。

🧝‍♂️源码和详解

特别强调做题的时候要看好测试数据的范围以免造成不必要的错误。

class Solution {
    public double myPow(double x, int n) {
        long N = n;
        //从条件里面可以看出来指数会存在负数的情况
        return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
    }

    public double quickMul(double x, long N) {
    //递归常用伎俩
        if (N == 0) {
            return 1.0;
        }
        //
        double y = quickMul(x, N / 2);
        //进行奇偶判断奇数要乘上x
        return N % 2 == 0 ? y * y : y * y * x;
    }
}

🧝‍♂️面试题

Java为什么不建议使用序列化?

1·了解什么是序列化

把对象转换为字节序列的过程称为对象的序列化。

2·什么情况下需要用到序列化

把的内存中的对象状态保存到一个文件中或者数据库中时候; 使用套接字在网络上传送对象的时候; 通过RMI传输对象的时候; 总之一句话,只要我们对内存中的对象进行持久化或网络传输, 都需要进行序列化和反序列化。

3·为什么不能

1、无法跨语言 通过Java的原生Serializable接口与ObjectOutputStream实现的序列化,只有java语言自己能通过ObjectInputStream来解码,其他语言,如C、C++、Python等等,都无法对其实现解码。而在我们实际开发生产中,有时不可避免的需要基于不同语言编写的应用程序之间进行通信,这个时候Java自带的序列化就无法搞定了 2、性能差 我们来对比Java自带的序列化与NIO中的ByteBuffer编码的性能 3、序列后的码流太大 java序列化的大小是二进制编码的5倍多!

序列化后的二进制数组越大,占用的存储空间就越多,如果我们是进行网络传输,相对占用的带宽就更多,也会影响系统的性能