2021-08-30-001.整数除法

001.整数除法

  • leetcode链接
  • 题目要求不允许使用语言中内置的 /*% 去实现,实现思路如下
  • 如:15 / 2 = 7 … 1 => 15 - 2 * 7 = 1,因此首先可以使用减法来实现,但当被除数为n,除数为1时,n就需要减去n次的1,即需要遍历n次,最坏的时间复杂度为O(n)

/**
 * @param {number} a
 * @param {number} b
 * @return {number}
 */
 var divide = function(a, b) {
  // 1. 溢出情况判断
  if (a === (-2)**31 && b === -1) return 2**31 - 1;

  // 转负数进行除法
  let flag = a * b < 0;
  a = a < 0 ? a : -a;
  b = b < 0 ? b : -b;

  let res = 0;
  while (a <= b) {
    res += 1;
    a -= b;
  }

  return flag ? -res : res;
};
  • 而想优化该算法,结合所学的短除法,考虑48 / 9,48的二进制为110000,记为a;9的二进制为1001,记为b,然后分析每一步是如何来的,而我们该如何去模拟该它 ?
  • 图片来源
    在这里插入图片描述
  • 我们已知a = 48 = 110000,b = 9 = 1001,res = 0
    ① 右移5位的a,由110000 => 1
    ② 右移4位的a,由110000 => 11
    ③ 右移3位的a,由110000 => 110
    ④ 右移2位的a,由110000 => 1100,且1100大于等于1001,相除,再a减去1001,即a为001100,相应的res += 1 <<< 2
    ⑤ 右移1位的a,由001100 => 00110,小于1001
    ⑥ 右移0位的a,由001100 => 001100,大于1001,相除,再a减去1001,即a为000011,相应的res += 1 <<< 0
/**
 * @param {number} a
 * @param {number} b
 * @return {number}
 */
 var divide = function(a, b) {
  // 1. 溢出情况判断
  if (a === (-2)**31 && b === -1) return 2**31 - 1;

  // 转负数进行除法
  let flag = a * b < 0;
  a = Math.abs(a);
  b = Math.abs(b);

  // 2. 二进制的短除法,通过有符号移动
  let res = 0;
  for (let i = 31; i >= 0; i --) {
      if ((a >>> i) >= b) {
          res += 1 << i;
          a -= b << i;
      }
  }
  
  if (flag && res < 0) res = -res;
  return flag ? -res : res;
};
  • 而另一种则是通过左移b到最后面从而实现的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值