在官网的解法中,需要使用开辟新的内存空间,仔细分析发现内存空间没必要开辟,具体算法如下:
int divide(int dividend, int divisor) {
// 考虑被除数为最小值的情况
if (dividend == INT_MIN) {
if (divisor == 1) {
return INT_MIN;
}
if (divisor == -1) {
return INT_MAX;
}
}
// 考虑除数为最小值的情况
if (divisor == INT_MIN) {
return dividend == INT_MIN ? 1 : 0;
}
// 考虑被除数为 0 的情况
if (dividend == 0) {
return 0;
}
// 一般情况,使用类二分查找
// 将所有的正数取相反数,这样就只需要考虑一种情况
bool rev = false;
if (dividend > 0) {
dividend = -dividend;
rev = !rev;
}
if (divisor > 0) {
divisor = -divisor;
rev = !rev;
}
int t_TotalCnt_i = 0;
int t_Multiple_i = 0;
int t_Data_i = divisor;
int t_DividendRemainder = 0;
// 注意溢出
int i = 0;
while (t_Data_i >= dividend) {
t_Multiple_i = (1 << i);
i++;
if(t_Data_i > dividend - t_Data_i)
t_Data_i = (t_Data_i + t_Data_i);
else
{
break;
}
}
t_TotalCnt_i = t_Multiple_i;
if(t_Multiple_i > 0)
{
t_DividendRemainder = dividend - (t_Data_i);
}
else
{
t_DividendRemainder = dividend;
}
while(divisor >= t_DividendRemainder)
{
if(t_Data_i >= t_DividendRemainder)
{
t_DividendRemainder -= t_Data_i;
t_TotalCnt_i += t_Multiple_i;
}
t_Multiple_i = (t_Multiple_i >> 1);
t_Data_i = (t_Data_i >> 1);
}
return rev ? -t_TotalCnt_i : t_TotalCnt_i;
}