力扣50(java)-Pow(x,n)(中等)
题目:
实现 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
x n就是将x1,x2,x3,x4,...,xn-1,xn相乘的结果。
一、分解指数、递归
xn:将指数n化小,需要考虑三种情况
1.n为负数的情况:x-n = 1 / xn
2.n为奇数的情况:先分解出一个n,再将剩下的n-1再分解成(n-1)/2, xn = x * x (n-1)/2 * x(n-1)/2
3.n为偶数的情况:xn = x n/2 * x n/2 = (x2)n/2
代码:
1 class Solution {
2 public double myPow(double x, int n) {
3 long b = n;
4 if(b < 0){
5 return 1 / youPow(x, -b);
6 }
7 return youPow(x, b);
8
9 }
10 public double youPow(double x, long n){
11 //底数为1或者指数为1的情况
12 if(x == 1.0 || n == 0) return 1;
13 if((n % 2) == 0){
14 return youPow(x*x, n/2);
15 }
16 return x * youPow(x, n-1);
17 }
18 }

二、二进制
将十进制数n转化成二进制形式,设为amam-1...a3a2a1,故二进制与十进制之间的转换为n = 20a1 + 21a2 + 22a3 + ... + 2m-2am-1 + 2m-1am,故xn = x 20a1 + 21a2 + 22a3 + ... + 2m-2am-1 + 2m-1am = x1a1 * x2a2 * x 4a3 * x2m-2am-1 * x 2m-1am
这就把问题转换为
1.求xn转换成求x, x2, x4, x2的m-2(2的m-2次方), x2的m-1(2的m-1次方),循环累乘x2;
2.求二进制的各位数
- 先判断最右位是否为1 ==> n &1
- 将n右移一位,判断下一个最右位 ==> n >> 1
整个思路为:
1.先排除x== 0.0的情况,0的任何次幂都为0,直接返回0;
2.将整数n转换成浮点型,因为int的范围为 [−2147483648,2147483647] ,当 n = -2147483648时,n变为正数,就会导致越界;
3.初始化结果res = 1;
4.循环二进制数,直至n = 0时跳出循环:
- 当n & 1 == 1时,将x乘入res;
- 执行x = x 2;
- 将n右移1位,n >>= 1;
5.返回结果res。
代码:
1 class Solution {
2 public double myPow(double x, int n) {
3 if(x == 0.0) return 0;
4 long b = n;
5 if(b < 0){
6 x = 1 / x;
7 b = -b;
8 }
9 double res = 1.0;
10 while(b > 0){
11 if((b & 1) == 1){
12 res *= x;
13 }
14 x *= x;
15 b >>= 1;
16 }
17 return res;
18 }
19 }

力扣50(java)-Pow(x,n)(中等)的更多相关文章
- 力扣50题 Pow(x,n)
本题是力扣网第50题. 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 采用递归和非递归思路python实现. class Solution: #递归思路 def myPow_recurs ...
- 刷题-力扣-50. Pow(x, n)
50. Pow(x, n) 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/powx-n/ 著作权归领扣网络所有.商业转载请联系官方授 ...
- 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题
题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...
- 力扣1438. 绝对差不超过限制的最长连续子数组-C语言实现-中等难度
题目 传送门 文本 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条 ...
- 力扣1052. 爱生气的书店老板-C语言实现-中等难度
题目 传送门 文本 今天,书店老板有一家店打算试营业 customers.length 分钟.每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开. 在某些时 ...
- 【力扣】剑指 Offer 50. 第一个只出现一次的字符
在字符串 s 中找出第一个只出现一次的字符.如果没有,返回一个单空格. s 只包含小写字母. 示例: s = "abaccdeff"返回 "b" s = &qu ...
- 力扣算法经典第一题——两数之和(Java两种方式实现)
一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
- JS数据结构第六篇 --- 二叉树力扣练习题
1.第226题:翻转二叉树 递归+迭代两种实现方式: /** 反转二叉树 * Definition for a binary tree node. * function TreeNode(val) { ...
- 力扣643.子数组最大平均数I-C语言实现
题目 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示例: 输入:[1,12,-5,-6,50,3], k = 4 输出:12.75 解释:最大平均数 (12-5- ...
- 【力扣leetcode】-787. K站中转内最便宜的航班
题目描述: 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 p ...
随机推荐
- 基于python的指定时段执行实例解析
一 概念: python中库很多,这里熟悉下time和interval的用法 二 实例解析 切记这里的interval,输出的是目前的时间是一个数组. import time from interva ...
- 新服务器搭建docker跑mysql+java项目
参考:https://js.work/posts/1362ba443b35d(yum安装java17) 踩了两个坑,一个前面的conf文件里监听80的配置没有删除掉,一个项目配置里面的路径还在用服务器 ...
- CentOS 同时安装多个版本的Python3
1.背景 已安装了 Python3.6.4,需要再安装 Python3.9 版本 2.操作步骤 (1)寻找当前 Python3.9 版本最新稳定版的子版本 通过官网查找,目前为 3.9.18,下载到本 ...
- 巧用Maya轴心操作小技巧,工作事半功倍!
Maya 是一款专业的三维软件,可以用于创建规模宏大的世界.复杂的角色和炫酷的特效.Maya的用户遍布动画行业.影视特效.广告和片头.平面设计行业,用户数量十分庞大.本文分享了maya轴心操作的小技巧 ...
- django(web框架推导、简介、数据库初识)
一 web框架推导 1 软件开发架构 cs架构bs架构bs本质是也是cs # HTTP协议:无状态,无连接,基于请求,基于tcp/ip的应用层协议 # mysql:c/s架构,底层基于soket,自己 ...
- Boruta特征选择
Boruta特征选择 官方github地址:https://github.com/scikit-learn-contrib/boruta_py?tab=readme-ov-file 论文地址:http ...
- Oracle 获取月初、月末时间,获取上一月月初、月末时间
select trunc(sysdate, 'mm'), last_day(trunc(sysdate)), trunc(add_months(trunc(sysdate), -1), 'mm'), ...
- matlab的基本操作
matlab的基本操作 1.写在前面 最近在处理一些作业时用到了matlab,发现以前学习的语句已经忘得差不多了.现在找到以前的学习资料,重新复习一下.顺便总结一下知识点,以免下一次使用时又忘记了而又 ...
- C++中自定义事件与委托
自定义事件,和委托其实是一类操作. 在蓝图中都表现为红色方块. 自定义事件通过DECLARE_EVENT(ClassName, EventName)来创建一个属于ClassName的EventName ...
- 重磅官宣 | 第二届OpenHarmony技术峰会,邀您共启智联未来
"下一个技术未来在哪里?" 11月4日 技术大咖齐聚北京为你解答 一场主论坛+八大开源领域分论坛 探究终端操作系统十大技术挑战方向 与全球开源操作系统技术领袖.实践专家.一线 ...