给定两个整数,被除数 dividend
和除数 divisor
。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend
除以除数 divisor
得到的商。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
说明:
- 被除数和除数均为 32 位有符号整数。
- 除数不为 0。
- 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
题目看似简单,坑还是蛮多的。
开始觉得只要拿到绝对值,除法转为减法,a/b abs(a)- abs(b) 然后计数即可。尝试了一下先不管方法是否可行,在a特别大,b特别小的时候这速度。。。。。此方案直接pass
任何一个整数可以表示成以2的幂为底的一组基的线性组合
2的多少次方可以用位移操作来计算
class Solution {
fun divide(dividend: Int, divisor: Int): Int {
if (0 == divisor) return 0
if (dividend == Int.MIN_VALUE && -1 == divisor) return Int.MAX_VALUE
var dividendL: Long = absMy(dividend.toLong())
var divisorL: Long = absMy(divisor.toLong())
var result = 0
val sign = (dividend shr 31) xor (divisor shr 31)
// println("sign:$sign")
while (dividendL >= divisorL) {
var c = 1
var temp = divisorL
while (dividendL >= temp shl 1) {
temp = temp shl 1
c = c shl 1
}
result += c
dividendL -= temp
}
return when {
result >= Int.MAX_VALUE -> Int.MAX_VALUE
sign < 0 -> 0 - result
else -> result
}
}
}
fun absMy(entry: Long) = if(entry >0) entry else 0 - entry
注:leetcode上居然不支持默认的abs方法,没辙了再外面自己瞎写一个凑合
这是我刚刚申请的微信公众号,欢迎大家关注。