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% 的用户

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

你可能感兴趣的:(leetcode,算法代码demo)