`

Leetcode - Pow(x, n)

 
阅读更多
[分析] 数值计算类型题目,二分法或者借助位运算,本题两种方法都可解。实现1是二分法思路,缺点是递归可能导致栈溢出。实现2是借助位运算,并进行了各种溢出检查和处理。实现3同样是位运算法,除了计算过程使用long类型的n外没有进行其他溢出保护,代码非常简洁,利于理解题目本身思路,实际应用中需要像实现2那样做溢出检查以保证程序的健壮性。

[ref]
http://www.cnblogs.com/TenosDoIt/p/3802902.html
http://blog.csdn.net/linhuanmars/article/details/20092829

public class Solution {
    // Method 1: 二分法
    public double myPow1(double x, int n) {
        if(n == 0)
            return 1;
		
        if(x == 0)
            return 0;
        else if(x == 1)
            return 1;
        else if(x == -1){
            return ((n & 1) == 1) ? -1 : 1;
        }
        
        double half = myPow(x, n / 2);
        if((n & 1) == 0)//even
            return half * half;
        else if(n > 0)
            return half * half * x;
        else 
            return half * half / x;
    }
    // Method 2:位运算, 包含各种防溢出处理
    public double myPow2(double x, int n) {
        if (x == 0)
            return 1;
        double res = 1.0;
        if (n < 0) {
            if (x >= 1.0 / Double.MAX_VALUE || x <= 1.0 / Double.MIN_VALUE)
                x = 1.0 / x;
            else
                return Double.MAX_VALUE;
            if (n == Integer.MIN_VALUE) {
                res *= x;
                n++;
            }
        }
        boolean isNeg = false;
        if (x < 0 && (n & 1) == 1)
            isNeg = true;
        x = Math.abs(x);
        n = Math.abs(n);
        while (n > 0) {
            if ((n & 1) == 1) {
                if (res < Double.MAX_VALUE / x)
                    res *= x;
                else
                    return Double.MAX_VALUE;
            }
            x *= x;
            n >>= 1;
        }
        return isNeg ? -res : res;
    }
    // Method 3: 位运算,不检查溢出
    public double myPow(double x, int n) {
        if (x == 0)
            return 1;
        double res = 1.0;
        long nn = n;
        if (nn < 0)
            nn = -nn;
        while (nn > 0) {
            if ((nn & 1) == 1) {
                res *= x;
            }
            x *= x;
            nn >>= 1;
        }
        return n >= 0 ? res : 1.0 / res;
    }
    
}
分享到:
评论

相关推荐

    三角形最小路径和LeetCode-Leetcode-July-Challenge-2020:包含Leetcode2020年七月挑战赛问题的解决

    Pow(x, n) 前 K 个频繁元素 课程表二 添加二进制 删除链表元素 词搜索 二叉树之字形水平顺序遍历 单号 III 从源到目标的所有路径 在旋转排序数组中求最小值 II 添加数字 从中序和后序遍历构造二叉树 任务计划程序 有...

    leetcode638python-leetcode-solutions:leetcode-解决方案

    pow(x,n) 简单的 7号 反向整数 简单的 6号 之字形反转 简单的 2号 添加两个数字 简单的 3号 无重复字符的最长子串 中等的 4号 两个有序数组的中位数 难的 2016 年 11 月 17 日更新 数字 问题 等级 最长回文子串 中等...

    Pow(xn)leetcode-Binary-Search-3:Binary-Search-3

    Pow(xn) leetcode Binary-Search-3 问题1 Pow(x,n) () 问题2 找到 K 个最近的元素 ()

    leetcode-problem:leetcode中问题的解决方案

    50-powx-n.md 6字形转换.md 7-反向整数.md 9回文数101-150(数量:30) 第101章 第102章 103二叉树之字形水平遍历.md 二叉树最大深度104.md 105从预购和有序遍历构建二叉树.md 106从顺序和后顺序

    股票买卖最佳时机leetcode-Leetcode-Lintcode-Python:用Python解决leetcode&lintcode问题

    股票买卖最佳时机leetcode 大批 (53) 最大子阵列 (54) 螺旋矩阵 (57) 插入间隔 (73) ...Pow(x, n) (69) 平方(x) (153) 在旋转排序数组中找到最小值 (154) 在旋转排序数组中求最小值 II (162) 寻找峰

    leetcode-python:这是我的python的leetcode解决方案

    在旋转排序数组中搜索140.Fast Power 428.Pow(x,n) 845.最大公约数39.恢复旋转排序数组8,旋转字符串 两个指针56.两次相加415.有效回文891.有效回文II 521.删除重复的号码604.窗口总和610.TwoSum-差等于目标228....

    leetcode530-leetcode-practice:练习力码

    leetcode 530 力码练习 前 250 个问题 1 二和 :check_mark: 3 无重复字符的最长子串 ...Pow(x, n) 51 N-Queens 52 N-Queens II 53 最大子阵 54 螺旋矩阵 55 跳跃游戏 56 合并间隔 57 插入间隔 59 螺旋矩阵II 6

    猜单词leetcode-leetcode:我的leetcode

    猜单词leetcode 通过 leetcode 学习数据结构与算法 数据结构 data structure 数组(栈 队列) 链表 ...50.pow-x-n.js 69.x-的平方根.js 278.第一个错误的版本.js 374.猜数字大小.py 递归 recursion +

    leetcode答案-LeetcodeTopAnswer:https://leetcode-cn.top的回答

    50.pow-x-n 题目: 答案: 69.x-的平方根 题目: 答案: 70.爬楼梯 题目: 答案: 94.二叉树的中序遍历 题目: 答案: 101.对称二叉树 题目: 答案: 141.环形链表 题目: 答案: 206.反转链表 题目: 答案: 剑指...

    扔鸡蛋leetcode-Leetcode:力码

    n-1 个整数的列表,这些整数在 1 到 n 的范围内。列表中没有重复项) 268.漏号 11. 编写代码来确定两棵树是否相同 100. 同一棵树 12. 编写一个程序来求一棵树的最大深度或高度 104. 二叉树的最大深度 13.将二叉树...

    leetcode2sumc-leetcode-practice:leetcode练习注意事项

    Pow(x, n) 中等的 51 N皇后区 难的 56 合并间隔 中等的 64 最小路径和 中等的 69 平方(x) 简单的 73 设置矩阵零 中等的 74 搜索二维矩阵 中等的 77 组合 中等的 78 子集 中等的 83 从排序列表中删除重复项 简单的 ...

    LeetCode-NoteBook:docsifyjs

    LeetCode笔记本docsifyjsLeetCode算法Java c / c ++ javascript的... Pow(x, n)34. First & LastPositionElementInSortedArr94. Binary Tree Inorder Traversal144. Binary Tree Preorder Traversal145. Binary Tree

    lrucacheleetcode-Leetcode-Questions:面试编码问题

    Pow(x, n) 最长公共子序列 第一个唯一编号 合并间隔 独特的路径 加一 二叉树最大路径和 检查字符串是否是二叉树中从根到叶路径的有效序列 排序颜色 最小窗口子串 第一个坏版本 子集 克隆图 直方图中最大的矩形 Base ...

    lrucacheleetcode-leetcode-rs:Leetcode算法问题的Rust解决方案

    Pow(x, n)中 53最大子阵列简单 55 Jump Game Medium 56合并间隔中等 57插入间隔硬 60排列序列介质 61轮播列表中 62条独特的路径中 64最小路径和中 66加一轻松 67添加二进制简单 70爬楼梯容易 72编辑距离困难 74搜索...

    删除无效括号leetcodeJava-ZY-LeetCode:zy的leetcode解决方案

    删除无效括号 leetcode ...Pow(x, n) M 2018-6-7 北京 Y 无重复字符的最长子串 M 2018-6-10 北京 Y 删除排序数组中的重复项 E 2018-6-13 北京 Y 字符串转整数 M 2018-6-15 北京 Y 有效的括号 E 2018-

    leetcode跳跃-CodingInterviews:这只是一个刷题笔记啊

    n).md](Leetcode/0050-Pow(x, n).md) 中等 困难 困难 简单 中等 中等 中等 困难 简单 中等 困难 中等 中等 中等 中等 困难 简单 简单 困难 简单 简单 中等 困难 中等 中等 中等 困难 中等 中等 中等 中等 中等 中等 ...

    leetcode中国-LeetcodeSolution:LeetCode题目-Java解法(持续更新)

    leetcode中国 LeetcodeSolution leetcode题目解法(持续更新) ...Pow(x, n) divide and conquer 51 N皇后 backtracking 52 N皇后 II backtracking 54 螺旋矩阵 array 62 不同路径 dynamic program

    LeetCode最全代码

    15 | [3 Sum](https://leetcode.com/problems/3sum/) | [C++](./C++/3sum.cpp) [Python](./Python/3sum.py) | _O(n^2)_ | _O(1)_ | Medium || Two Pointers 16 | [3 Sum Closest]...

    leetcode卡-July-Challenge-Leetcode:七月-挑战-Leetcode

    天:Pow(x,n) () 第17天:前K个频繁元素() 第 18 天:课程表 II () 第 19 天:添加二进制 () 第 20 天:删除链表元素 () 第 21 天:单词搜索 () 第22天:二叉树之字形水平顺序遍历() 第 23 天:单数 III () 第 ...

    Leetcode扑克-coding-interviews:编码面试

    Leetcode扑克 项目简介 该项目为《剑指Offer》题解 OnlineJudge 题目 个人建议能使用LeetCode还是尽量用LeetCode。...Pow(x, n) 调整数组顺序使奇数位于偶数前面 905. Sort Array By Parity 链表中倒数第

Global site tag (gtag.js) - Google Analytics