博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode]Power
阅读量:4652 次
发布时间:2019-06-09

本文共 1868 字,大约阅读时间需要 6 分钟。

周五的晚上,女朋友看爸爸去哪儿,电脑都是我的,狂刷LeetCode,做了十来题,最有印象的还是。题目如下:

Implement pow(xn).就是实现x的n次方。

这是一题很传统的题目了,但是之前没认真思考过。

第一个想法:比如计算pow(x, 100), 计算x,x^2,x^4,x^8,x^16,x^32,x^64.这些中间值都保存起来,再从后面开始遍历x^64*x^32*x^4;

要注意的是pow(xn)n有可能是0或者负数哦。

代码如下:

class Solution {public:    double pow(double x, int n) {        if (0==n)        {            return 1;        }        if (n < 0)        {            n = -n;            x = 1/x;        }        int current = 1;        vector
pd; pd.push_back(x); while (current<<1 < n) { x = x*x; current = current<<1; pd.push_back(x); } int need = n-current; for (auto it = pd.rbegin(); need > 0 && it != pd.rend(); ++it) { if (current <= need) { x*=*it; need-=current; } current=current>>1; } return x; }};

然后 Memory Limit Exceeded 了:(看来中间值不能保存啊!

如果不保存中间值,总不能计算pow(x, 100), 计算x,x^2,x^4,x^8,x^16,x^32,x^64;然后再计算x,x^2,x^4,x^8,x^16,x^32;然后再计算x,x^2,x^4。

100 = 64+32+4,先做分解再算,突然意识到这不就是二进制表示吗,于是代码就简单了:

 

class Solution {public:    double pow(double x, int n) {        if (n == 0)        {            return 1;        }        if (n < 0)        {            n = -n;            x = 1/x;        }        double result = 1;        while (n > 0)        {            if (n&1==1)            {                result *= x;            }            x *= x;            n = n >> 1;        }        return result;    }};

本来觉得这个代码已经够简洁了,在Disscus看到有人用递归,自己也写了一个,除了特殊情况的判断,就一句话:

class Solution {public:    double pow(double x, int n) {        if (n == 0)        {            return 1;        }        if (n < 0)        {            n = -n;            x = 1/x;        }        return n%2 ? pow(x*x, n>>1)*x : pow(x*x, n>>1);    }};

 

转载于:https://www.cnblogs.com/yezhangxiang/p/3930483.html

你可能感兴趣的文章
C#语言使用习惯
查看>>
设计模式总结篇系列:装饰器模式(Decorator)
查看>>
奥东......C# 的我经历过的那些事情
查看>>
奥东......NGUI 小技巧汇总
查看>>
java反射(Field的应用)
查看>>
主流浏览器与内核
查看>>
js中常见的一些兼容性问题
查看>>
BZOJ4816 SDOI2017 数字表格 莫比乌斯反演
查看>>
Java报错--Unsupported major.minor version 52.0
查看>>
PHP之音乐ID3扩展
查看>>
javasctipt string对象 array对象总结
查看>>
hadoop centos配置
查看>>
动态代理初识
查看>>
linux下方便的录屏命令
查看>>
奥卡姆剃刀(简约之法则)
查看>>
博客园团队的邮箱contact@cnblogs.com
查看>>
sql(join on 和where的执行顺序)
查看>>
数据仓库与数据库的区别
查看>>
HDU5406---CRB and Apple( DP) 2015 Multi-University Training Contest 10
查看>>
0x01 MySQL What's DataBase
查看>>