两数相除-kotlin

给定两个整数,被除数 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方法,没辙了再外面自己瞎写一个凑合

你可能感兴趣的:(LeetCode)