Leetcodeアルゴリズムのトピック---整数の累乗を求める(2点再帰)

これは最近ブラシをかけられたトピックで、単純に見えますが、手書きのライブラリ関数に相当するライブラリ関数を呼び出すことは許可されていません。まず、暴力的なループについて考えますが、このメソッドの時間計算量は高すぎます。そして、システム上で生きるのは難しいです、ハハハ。問題解決のスキルについては、以下を参照してください。
ここに画像の説明を挿入

アイデア:

看不明白过程看图片中的伪代码就理解了

ここに画像の説明を挿入

//一刷战败 :
/*
这测试用例再来一百个,好评
2.00000
-2147483648
 */
//传统做法时间复杂度高,经不起测试,改用快速幂的思想
var myPow = function(x, n) {
    
    
    let reusult = 1.0
    //如果负数,2^-2可以变成 (1/2)^2
    if(n<0){
    
    
        //js中默认不是整除
        x = 1/x 
        n = -n
    }
    while(n>0){
    
    
        if(n&1){
    
    
            reusult*=x
        }
        x*=x
        //我的天,js中的移位还出错
        //原来是>>是有符号数的移位,>>>这个是无符号数的移位
        //下面第一种是错误的,剩下两个都是正确的
        // n = n>>1
        // n = Math.floor(n/2)
        n = n>>>1
    }
    return reusult
};

コードを読んだ後、理解できますか?、シフト演算子は使いにくい場合があります。ここでは算術シフトと論理シフト演算が含まれます。入力数が大きすぎると、プログラムが折りたたまれます。次の一連のテストケースがハイライトです。
2.00000
-2147483648

詳細については、他のブログを参照してください

ポータル

おすすめ

転載: blog.csdn.net/qq_44606064/article/details/114695930