第一反应
注意边界条件,注意溢出处理。
- 由于不允许用乘法和除法和mod,所以第一个想到的是模仿除法的过程,用依次减法,直到剩下的不够减。考虑到大数字除以小数字的情况,这样很容易超时,应该不是。
- 第二个想到的是用类似于除法列竖式。实现一个部分除法功能,用于计算商为1位数的情况,然后模仿列竖式,求余数,乘以10之后加上下一位作为下一个被除数(递归?)。感觉可行。
- 第三个想法是没有必要拘泥于10进制,如果用2进制的除法就更简单,商只有0和1
- 关于边界条件可能溢出,由于除数和被除数都是整数,商肯定是小于等于除数,除数不会溢出。。。哦我知道了,只有-2^31 除以-1这一个情况会溢出。那可以单独处理一下?
在写的过程中又遇到了新的问题:因为禁止用乘法和除法,怎么才能把数字写成二进制形式,然后截取一部分进行对比呢?甚至连除以2都没法用。同理,就算我获得了二进制形式的答案按照每一位存在数组里,最后拼起来也要用加法而不是乘法(这里用2比用10方便多了)
现在的问题还是怎么在不用乘法除法的情况下写成二进制形式然后截取头部的一部分。
有没有一种可能性,就是先用加法和减法实现一下乘法,然后用自己实现的乘法来实现除法。
想不出来,看看题解
看看题解
这是中等题?
需要用到快速乘,而快速乘是另一道题。那我马上开始做LeetCode第50题 快速幂,做完再来看这题
快速幂做完了,然后看题解发现有用到左移作为除以二的方法,我想我可以试试我的列竖式了。有除以二能用就有一切。
惊鸿一瞥,看到这个思路感觉可行,而且比我的那个简单,甚至不用位运算这种擦边球,感觉值得一试
java知识
java的逻辑运算符
^ //异或
& 和 && 的区别:如果左边是false,&&会跳过右半边的计算
|和||同理
位运算符:左移等价于除以二
tmp <<= 1;
提交通过
class Solution {
public int divide(int dividend, int divisor) {
if(dividend == 0){
return 0;
}
//虽然很憨,但是管用
if(dividend == -2147483648 && divisor == -1){
return 2147483647;
}
//divisor不为0