leetcode372,菜是原罪系列,leetcode372

被这道题折磨的死去活来,果然菜是原罪,找资料各种补啊,要感谢下面三处

1.参考视频链接:小Q刷Leetcode第27期 365-373

https://www.bilibili.com/video/av14125208/?p=5

只用了第十二分钟左右的方法,后面那个什么欧拉什么的直接放弃了,看不懂,最后有个按十进制位做的,倒是也可以,但是java和c++可能实现上稍有不同把,不太懂

2.关于快速幂框架可以参考LeetCode 372. Super Pow解题思路(超详细)

https://blog.csdn.net/beyond702/article/details/53222077#commentBox

但是最后那个的代码是过不去的,就不要浪费时间看了,主要是我太菜也没看懂

3.最后这个是比较牛逼的做法了,文章中还有关于欧拉函数是实现,先mark一下,刚开始那个数组我确实不明白为什么要%2又/2之类的,这篇算是讲到了本质吧,LeetCode 372. Super Pow

https://www.cnblogs.com/micrari/p/5739769.html#undefined

下面就是最后用的过的代码了,其实基本上就是把第一个视频中的代码改成了java版本,所以还是感谢nat8023

class Solution {
    public static final int mod = 1337;
    public static int superPow(int a, int[] b) {
        a = a % mod;
        int left = 0,right = b.length - 1;
        int res = 1;
        //以下为快速幂
        for(int mul = a ; left <= right ; ){
            if( b[right]%2==1){
                res = res * mul % mod;
            }
            //以下为手动除法
            int inc = 0;
            int newinc = 0;
            for(int i = left ; i <= right ;i++,newinc = 0){
                if((inc*10 + b[i]) % 2 == 1){
                    newinc = 1;
                }
                b[i] = (inc*10 + b[i]) / 2;
                inc = newinc;
            }
            //手动除法完毕
            //过滤前导0
            while(left <= right && b[left] == 0){
                left++;
            }
            //过滤前导0完毕
            mul = mul*mul%mod;
        }
        return res;
    }
}
执行用时: 254 ms, 在Super Pow的Java提交中击败了14.77% 的用户

还是有些尴尬的,算了,以后再说,先过了再说吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值