LeetCode 题解(177): Divide Two Integers
来源:互联网 发布:电网linux系统常用命令 编辑:程序博客网 时间:2024/04/30 21:15
题目:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题解:只能用移位运算,以2为基模拟除法。
边界情况: divisor == 0 ==> result = INT_MAX, dividend == INT_MIN, divisor == -1 溢出 ==> result = INT_MAX
dividend == INT_MIN,divisor != -1:
dividend -= abs(divisor), result++。
用base表示基,求divisor不大于dividend的最大值,然后dividend减去divisor,更新result, base和divisor。
C++版:
class Solution {public: int divide(int dividend, int divisor) { if(divisor == 0) return INT_MAX; bool isNeg = abs((dividend ^ divisor) >> 31); int result = 0; if(dividend == INT_MIN) { if(divisor == -1) return INT_MAX; dividend += abs(divisor); result++; } if(divisor == INT_MIN) return result; dividend = abs(dividend); divisor = abs(divisor); int base = 0; while(divisor <= (dividend >> 1)) { divisor <<= 1; base++; } while(base >= 0) { if(dividend >= divisor) { result += (1 << base); dividend -= divisor; } divisor >>= 1; base--; } return isNeg ? -result : result; }};
Java版:
public class Solution { public int divide(int dividend, int divisor) { if(divisor == 0) { return Integer.MAX_VALUE; } boolean isNeg = (dividend^divisor)>>>31 == 1; int res = 0; if(dividend == Integer.MIN_VALUE) { dividend += Math.abs(divisor); if(divisor == -1) { return Integer.MAX_VALUE; } res++; } if(divisor == Integer.MIN_VALUE) { return res; } dividend = Math.abs(dividend); divisor = Math.abs(divisor); int digit = 0; while(divisor <= (dividend>>1)) { divisor <<= 1; digit++; } while(digit>=0) { if(dividend>=divisor) { res += 1<<digit; dividend -= divisor; } divisor >>= 1; digit--; } return isNeg?-res:res; }}
Python版:
class Solution: # @param {integer} dividend # @param {integer} divisor # @return {integer} def divide(self, dividend, divisor): if divisor == 0: return sys.maxint if dividend == -2147483648 and divisor == -1: return 2147483647 isNeg = abs((dividend ^ divisor) >> 31) dividend = abs(dividend) divisor = abs(divisor) result, base = 0, 0 while divisor <= (dividend >> 1): divisor <<= 1 base += 1 while base >= 0: if dividend >= divisor: result += (1 << base) dividend -= divisor divisor >>= 1 base -= 1 return -result if isNeg else result
0 0
- LeetCode 题解(177): Divide Two Integers
- LeetCode题解:Divide Two Integers
- [题解][LeetCode][Divide Two Integers]
- LeetCode题解:Divide Two Integers
- LeetCode题解——Divide Two Integers
- leetcode题解-29. Divide Two Integers
- LeetCode: Divide Two Integers
- [LeetCode]Divide Two Integers
- LeetCode: Divide Two Integers
- [LeetCode] Divide Two Integers
- [Leetcode] Divide Two Integers
- LeetCode Divide Two Integers
- 【leetcode】Divide Two Integers
- [LeetCode]Divide Two Integers
- LeetCode-Divide Two Integers
- LeetCode: Divide Two Integers
- Divide Two Integers - leetcode
- Leetcode: Divide Two Integers
- Shortest Palindrome
- ubuntu环境开发android时候无法找到aapt
- Mac下 Lua 添加库 luafilesystem
- ViewPager+Fragment的使用
- 黑马程序员--包、多线程
- LeetCode 题解(177): Divide Two Integers
- Rexsee是基于Android的HTML5开发平台
- LeetCode 题解(178): Swap Nodes in Pairs
- C#制作、打包、签名、发布Activex全过程
- C语言指针的算术运算
- 黑马程序员-----Java基础-----线程与同步
- 第一个leapmotion的小游戏
- Kinect体感机器人(三)—— 空间向量法计算关节角度
- LeetCode 题解(179): Generate Parentheses