力扣372(java)-超级次方(中等)
题目:
你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。
示例 1:
输入:a = 2, b = [3]
输出:8
示例 2:
输入:a = 2, b = [1,0]
输出:1024
示例 3:
输入:a = 1, b = [4,3,3,8,5,2]
输出:1
示例 4:
输入:a = 2147483647, b = [2,0,0]
输出:1198
提示:
- 1 <= a <= 231 - 1
- 1 <= b.length <= 2000
- 0 <= b[i] <= 9
- b 不含前导 0
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/super-pow
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:递归+快速幂
拆分方式,将数组b的最后一位值作为次方的值,就可以将每次幂运算缩小。
例如a = 5 , b = [123]

这里每次求幂计算之前 和 之后都要 %1337,防止数值过大,导致求幂的结果溢出。(先求幂再取模 与 先取模再求幂得到的结果一样)
一、将每一个次方都转化成 10以内的数字,写一个pow(int a, int b)方法处理10以内的幂次方,需要进行以下步骤:
1.先将底数与MOD取模运算;
2.判断指数的奇偶性,如果为偶数,就将指数分为对等两份计算,如果为奇数,就需要先提出一个底数,再将指数(这时候为偶数了)分为对等两份进行运算。
二、将大于10的指数进行分解,写一个indexpow( int a, int[] b, int inde)方法,进行以下步骤:
1.特殊判断,b数组长度为0的情况,直接返回1;
2.然后从数组b中从后往前分解出最低位的指数和剩余的指数,例如 2123 = (2 12*10+3)= 212*10 + 23 = (212)10+23
代码:
1 class Solution {
2 int MOD = 1337;
3 public int superPow(int a, int[] b) {
4 return indexpow(a, b, b.length - 1) % MOD;
5 }
6 private int indexpow(int a, int[] b, int index){
7 //如果数组长度为0,则index = -1
8 if(index == -1) return 1;
9 //(5^12)^10 * 5^3
10 //index-1:最后一位数的前一位
11 return pow(indexpow(a, b, index-1), 10) * pow(a, b[index]) % MOD;
12 }
13 //10以内的幂次方
14 private int pow(int a, int b){
15 a %= MOD;
16 //如果底数为1或者指数为0
17 if(a == 1 || b == 0) return 1;
18 //如果指数为偶数
19 if((b & 1) == 0){
20 return pow(a * a, b/2) % MOD;
21 }else{
22 //如果指数为奇数就需要先分一个底数出来
23 return a * pow(a, b-1) % MOD;
24 }
25 }
26 }

力扣372(java)-超级次方(中等)的更多相关文章
- Java实现 LeetCode 372 超级次方
372. 超级次方 你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出. 示例 1: 输入: a = 2, b = [3] 输出: 8 示例 2: ...
- C#版(击败100.00%的提交) - Leetcode 372. 超级次方 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...
- Leetcode 372.超级次方
超级次方 你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出. 示例 1: 输入: a = 2, b = [3] 输出: 8 示例 2: 输入: a ...
- 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题
题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...
- 力扣1438. 绝对差不超过限制的最长连续子数组-C语言实现-中等难度
题目 传送门 文本 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条 ...
- 力扣1052. 爱生气的书店老板-C语言实现-中等难度
题目 传送门 文本 今天,书店老板有一家店打算试营业 customers.length 分钟.每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开. 在某些时 ...
- 力扣算法经典第一题——两数之和(Java两种方式实现)
一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
- 力扣50题 Pow(x,n)
本题是力扣网第50题. 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 采用递归和非递归思路python实现. class Solution: #递归思路 def myPow_recurs ...
- 【力扣leetcode】-787. K站中转内最便宜的航班
题目描述: 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 p ...
- 力扣算法题—069x的平方根
实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...
随机推荐
- 灰度发布、蓝绿部署、金丝雀发布和AB测试及在k8s中的实现
灰度发布.蓝绿部署.金丝雀发布和AB测试都是软件开发和部署中常用的策略,每种策略都有其特定的用途和优势.下面是对这些策略的简要解释: 灰度发布(Grayscale Release): 灰度发布是一种逐 ...
- 音频编解码aac移植之ubuntu下aac的仿真的编译和运行
一 编译 aac的编译其实很简单,配置好预编译选项之后,立即在根目录下执行:make 即可. 第一步:./configure 第二步: make 第三步: sudo make install 二 运行 ...
- python计算二进制bin文件hash值
一 hash的价值 hash值的唯一性仅仅在是同一个文件的情况下得到了同样的hash值,而哪怕错误一个字节也会得到不一样的hash值. hash值得最大价值就是唯一性.这样在bin文件检查和校验这块用 ...
- github 上不去
win:C:\WINDOWS\system32\drivers\etc linux:/etc/hosts 在这个网址查询每个网址对应的ip:https://www.ipaddress.com/ 202 ...
- Elasticsearch - Docker安装Elasticsearch8.12.2
前言 最近在学习 ES,所以需要在服务器上装一个单节点的 ES 服务器环境:centos 7.9 安装 下载镜像 目前最新版本是 8.12.2 docker pull docker.elastic.c ...
- Java中float和double的精度
比较基本类型double和float和某一个数是否相等的时候,不要用==或>=或<=,因为double和float都是有精度问题的,计算机只能保存一定位数的小数,这就会存在精度问题. 下面 ...
- [STM32]STM32双机串口通信
[STM32]STM32双机串口通信 上一篇的通信方案在发送端高强度通信下寄了,发现是函数HAL_UART_Transmit()的锅,一个函数居然能跑0.3s左右...于是打算选用DMA收发数据,但是 ...
- 记录--uni-app实现京东canvas拍照识图功能
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近公司出了一个新的功能模块(如下图),大提上可以描述为实现拍照完上传图片,拖动四方框拍照完成上传功能,大体样子如下图.但是我找遍了 dc ...
- Python - inspect 模块的简单使用
Python中的inspect模块解析 Python的inspect模块是一个强大的内省工具,允许开发者检查(inspect)活动对象和源代码.它提供了一系列函数,用于获取信息关于正在运行的程序和调用 ...
- debian12 linux root能用lightdm登陆xfce桌面,普通用户不能用lightdm登陆xfce桌面,闪一下黑屏和一个_,又回到lightdm
Fn+Ctrl+F3,进入tty,发现登陆普通用户后再使用startxfce4可以直接进桌面 下面参照 https://forums.opensuse.org/t/normal-user-can-no ...