Leetcode 29 —— Divide Two Integers

29. Divide Two Integers

My Submissions
Total Accepted: 62780 Total Submissions: 403300 Difficulty: Medium

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

Subscribe to see which companies asked this question

Hide Tags
 Math Binary Search

題目要求:

不能使用乘除法和模操作 只能使用位運算和加減法


最開始想到的就是用被減去一直減去減數。。。  當然這樣的時間複雜度不是最優的。


接着想到以2爲基的數學形式表達,可以這樣做: 減數一直左移 直到大於被減數。

這樣是以2的冪次進行迭代,算法的時間複雜度爲 O(logn)


上代碼(已AC - 2016-03-24):

// 不能使用乘除法和模操作 只能使用位運算和加減法
int divide(int dividend, int divisor)
{
	// 邊界判斷
	if (divisor == 0 || (dividend == INT_MIN && divisor == -1))
		return INT_MAX;

	bool isNeg = (dividend < 0) ^ (divisor < 0);
	long long dvd = labs(dividend);
	long long dvs = labs(divisor);
	long long res = 0;
	while (dvd >= dvs)
	{
		long long tmp = dvs, mul = 1;
		while (dvd >= (tmp << 1))
		{
			tmp <<= 1;
			mul <<= 1;
		}
		dvd -= tmp;
		res += mul;
	}
	
	return (isNeg) ? -res : res;
}

另外,注意一下邊界數據的判斷,測試用例中有各種邊界條件的數據。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章