91.28パーセントをmycode
クラスのソリューション(オブジェクト): デフ(自己、配当、除数)分割: "" " :タイプの配当:INT :タイプ除数:INT :RTYPE:int型 """ 場合は除数== 0: 返さないなし の場合((配当^除数)< 0): フラグ = -1 他: フラグ = 1回の 配当 = ABS(配当)であれば配当<0 他配当 除数 = ABS(除数)場合除数<0 他除数 MAX = 2147483647 MIN = -2147483648 のres =(配当// 除数) であればフラグ== -1 : リターン MAX(MIN、フラグ* RES) 他: 返す分(MAX、RES)を
参考:
アイデア:実際には、除算を使用することはできませんが、私はまだ使用しています。。。。
この質問は二つの整数の前提の下で実施し、乗算、除算を使用せずに必要な算術除算モジュロています。オーバーフローがMAX_INTを返した場合。この質問は、常にそれがゼロになるまでの配当により除数を減算直接考えています。このアプローチの反復回数、すなわち、そのような結果は、Nであり、アルゴリズムの複雑さはO(N)であり、結果の大きさです。ビット、すなわちアナログコンピュータ上で除算演算、動作を最適化するために使用することができます。数すなわちNUM = A0 * 2 ^ 0 + A1 * 2 ^ 1 + A2 * 2 ^ 2 + ... + * 2 ^ nは、バイナリ形式に変換されます。上記の式に基づいて配当が最大カーディナリティは、2を乗じた左一当量を得るよりも大きくなるまで、あなたは除数が左せることができます。結果は、2 ^ Kを増加しながら配当を持つたびに、ベースを減算します。配当金は、これまで除数以下になるまで、繰り返しの左の番号を削除し、再び左に続けます。このプロセスの反復の数が2のべき乗で終了するまでであるため、時間複雑度は、O(LOGN)です。注目すべきは、主に記号やオーバーフローの問題に対処。オーバーフローが長い長い使用して最初に計算することができるため、オーバーフローが変位する前に変位するかどうかを決定することができます。
#時間複雑:O(LOGN)
複雑スペース#:O(1)
def divide(dividend, divisor): """ :type dividend: int :type divisor: int :rtype: int """ positive = (dividend < 0) is (divisor < 0) dividend, divisor = abs(dividend), abs(divisor) res = 0 while dividend >= divisor: temp, i = divisor, 1 print(dividend,divisor,temp,i,res) while dividend >= temp: dividend -= temp res += i i <<= 1 temp <<= 1 print('..',dividend,divisor,temp,i,res) if not positive: res = -res return min(max(-2147483648, res), 2147483647)
下面这个更好理解些
class Solution(object): def divide(self, dividend, divisor): """ :type dividend: int :type divisor: int :rtype: int """ ispositive = True if dividend > 0 and divisor < 0: ispositive = False if dividend < 0 and divisor > 0: ispositive = False dividend = abs(dividend);divisor = abs(divisor) if dividend < divisor: return 0 tmp = divisor ans = 1 while dividend >= tmp: tmp <<= 1 if tmp > dividend: break ans <<= 1 tmp >>= 1 nans = ans + self.divide(dividend - tmp,divisor) if ispositive: if ans > 2147483647: return 2147483647 return nans if ans >= 2147483648: return -2147483648 return 0 - nans 左移