LEETCODEノート
29:数で分割された2つの
二つの整数与えられ、配当被除数と除数除数。乗算、除算、およびMOD演算子を使用せずに2つの要件を分割します。
除数配当商除数GETで割った配当金は返します。
説明:
被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是int [min, max]。
本题中,如果除法结果溢出,则返回 int最大值
解決策1:最も可能性が高いと考えるためには、減算を行うことです。
簡単引き算の問題が発生しました:
1。除数と被除数象徴問題は、4例があるでしょう(++、±、 - +、 - ) あまりにも面倒です。ソリューション除数と配当金は、負または正の数に変換されます。
問題は、正の変換を生じる:配当= int型の最小値は、正数に変換されるがオーバーフローします。したがって、被除数と除数の判定が否定的に変換されます。
2.結果がオーバーフローします。唯一の配当=はInteger.MIN_VALUE &&除数= -1この場合があります。そのため別々に処理。
コードは以下の通りであります:
class Solution {
public int divide(int dividend, int divisor) {
if(dividend==Integer.MIN_VALUE && divisor==-1) return Integer.MAX_VALUE;
int x = dividend ;
int y = divisor ;
if(x > 0) x = -x;
if(y > 0 ) y = -y;
if(x > y) return 0;
int flag = 0;
if(dividend>0&&divisor<0 || dividend<0&&divisor>0) flag = 1;
int count = 0;
while(x <= y)
{
x = x - y;
count++;
}
if(flag==0) return count;
else return -count;
}
}
このアプローチの最大の問題は、時間制限を超えて、遅すぎることは明らかです。第二の溶液が必要です。
溶液II:遅いAマイナスので、そのように、より多くの失望。
例:
15 2 0
13 4 0 + 1 = 1である
。9. 8 0 + 1 + 2 = 3
1 16 2 + 1 + 0 + 4 = 7つの
1つの2計算結果
コードは次の通りであります
class Solution {
public int divide(int dividend, int divisor) {
if(dividend==Integer.MIN_VALUE && divisor==-1) return Integer.MAX_VALUE;
int x = dividend ;
int y = divisor ;
if(x > 0) x = -x;
if(y > 0 ) y = -y;
int disy = y;
if(x > y) return 0;
int flag = 0;
if(dividend>0&&divisor<0 || dividend<0&&divisor>0) flag = 1;
int count = 0;
int multiple = 1;
while(x <= disy)
{
if(x-y<=0)
{
x = x - y;
y += y;//翻倍减少
count += multiple;
multiple += multiple;//翻倍增加
}
else//y重新归到初始值
{
y = disy;
multiple = 1;
}
}
if(flag==0) return count;
else return -count;
}
}
コードに示されているように、一人一人、Y倍増、倍加倍数で増加しました。yが減少*これは、2のn乗の速度に相当します。現在Yが少ない初期値除数のX、Y値の背面よりなるまでの残り。再循環。