leetcode 29题

Posted by franki on June 7, 2021

leetcode 29题 两数相除

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例1

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333..) = truncate(3) = 3

示例2

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = truncate(-2.33333..) = -2

思路

倍数法

代码

/**
 * @param {number} dividend
 * @param {number} divisor
 * @return {number}
 */
var divide = function(dividend, divisor) {
  // 被除数 除数
  let a = dividend
  let b = divisor
  // 考虑 1 -1的情况
  let dir = 1
  if((a<0&&b>0)||(a>0&&b<0)){
    dir = -1
  }
  a=Math.abs(a)
  b=Math.abs(b)
  let res =0
  if(b===1){
    res=a
  }
  if(b!==1){
    res = div(a,b)
  }
  
  res = dir ===-1? -res:res
  // 这个条件是为了过leetcode的单元测试
  if(res>Math.pow(2,31)-1||res<Math.pow(-2,31)){
    return Math.pow(2,31)-1
  } 
  return res


  function div(a,b){
    // base case
    let count = 1 // 倍数
    if(a<b){
      return 0
    }
    let tb = b
    while(tb+tb<=a){
      // 这么写 tb加倍跟count绑定 所以加倍的tb应该符合条件 所以要预检测下tb+tb<=a
      tb+=tb // 相当于*2 加倍
      count+=count
    }
    let n= div(a-tb,b)
    return count+n
  }
}

复杂度分析:

  • 时间复杂度: O(N^2)
  • 空间复杂度:O(1)