这是我参与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倍多!
序列化后的二进制数组越大,占用的存储空间就越多,如果我们是进行网络传输,相对占用的带宽就更多,也会影响系统的性能
。