注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路。

描述

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

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

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

示例:

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

提示:

  • 被除数和除数均为 32 位有符号整数。
  • 除数不为 0。
  • 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,231−1][-2 ^ {31}, 2 ^ {31} - 1][−231,231−1]
  • 本题中,如果除法结果溢出,则返回231−12 ^ {31} - 1231−1

解题思路

像什么按位运算啦,二分啦,都是不错的选择,但是本着前端快速解决问题的思路,鄙人觉得这些方案虽然好,但是比较复杂。不如我们回归除法的本质。

所谓求 X / Y,在本题中,说白了就是看X中有多少个Y

明白上一句话,你就知道该怎么做了吧,比如求100 / 33,很明显,答案应该是3,那么怎么来的呢

    // 初始化sum,让其等于被除数let sum = divisor;// 统计个数的变量let count = 0;// 只要累加 divisor 后的结果 sum 小于 被除数, 就继续加 while(sum <= dividend){// 不断累加 divisor sum += divisor;// 每加一次,个数加1count ++;}
  • 33 < 100 ===> 33+33 = 66 count = 1
  • 66 < 100 ===> 66 + 33 = 99 count = 2
  • 99 < 100 ===> 99 + 33 =132 count = 3
  • 132 > 100 退出循环

当然,我们目前只考虑了被除数 和 除数都是正数的情况,毕竟测试用例中有正有负,所以我们需要对这两个数的符号进行判断,然后推断出结果的符号即可。

    const flag = (dividend < 0 ? 1:0 ) ^ (divisor < 0 ? 1:0)

括号里的三木运算符是将负数变为1,否则变为0;^是异或操作,两个数一样为0,不一样为1 。当两个数同为正数或同为负数时,商一定时正数,当两个数异号,则结果为负数。所以,我们可以根据flag是否为1,判断商应该是正数还是负数。

最后我们需要研究一下溢出的情况,首先,需要保证被除数不为0,所以有

    if (dividend === 0) return 0;

其次,如果被除数是最小值−231-2 ^ {31}−231,且被除数是 -1,则结果是2312 ^ {31}231,溢出了,根据题意,就需要返回最大值231−12^{31} - 1231−1

    if (dividend === MIN_VALUE && divisor === -1) return MAX_VALUE;

把上述一堆整理在一起,得到以下代码

var divide = function(dividend, divisor) {const MAX_VALUE = 2 ** 31 - 1, MIN_VALUE = -(2 ** 31);if (dividend === MIN_VALUE && divisor === -1) return MAX_VALUE;if (dividend === 0) return 0;// 判断最终的符号const flag = (dividend < 0 ? 1:0 ) ^ (divisor < 0 ? 1:0)divisor = Math.abs(divisor)dividend = Math.abs(dividend)let sum = divisor;let count = 0;while(sum <= dividend){sum += divisor;count ++;}if(flag) return -countreturn count
};

力扣题目——29. 两数相除相关推荐

  1. 力扣题目——653. 两数之和 IV - 输入 BST

    注:本文的实现思路主要是基于JS(JavaScript),涉及到的一些函数都是JS中的自带函数 题目描述 给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给 ...

  2. 力扣题目——1. 两数之和

    注:本文的实现思路主要是基于JS(JavaScript),涉及到的一些函数都是JS中的自带函数 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 t ...

  3. LeetCode高频题29. 两数相除:不用加减乘除号,求加法,减法,乘法,除法

    LeetCode高频题29. 两数相除 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批ACM竞赛 ...

  4. Java实现 LeetCode 29 两数相除

    29. 两数相除 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商 ...

  5. leetcode 29.两数相除

    leetcode 29.两数相除 题目描述 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 ...

  6. LeetCode-中等-29. 两数相除

    LeetCode-中等-29. 两数相除 题目 引用自:LeetCode-中等-29. 两数相除(如有侵权联系删除) 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不 ...

  7. LeetCode 29. 两数相除(位运算)

    1. 题目 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示 ...

  8. leetcode —— 29. 两数相除

    给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 整数除法的结果 ...

  9. ※29. 两数相除(java)

    给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.返回被除数 dividend 除以除数 divisor 得到的商.整数除法的结果应当 ...

最新文章

  1. 富交互Web应用中的撤销和前进
  2. 【Python合集】全面掌握Python基础知识,建议收藏
  3. Amoeba for MySQL
  4. Docker自动补全容器名
  5. python 找质数的个数_用Python打造一款文件搜索工具,所有功能自己定义!
  6. document.body.scrollTop用法
  7. 2016-03-17 leaks 内存泄露
  8. matlab2c使用c++实现matlab函数系列教程-ones函数
  9. docker安装es+kibana
  10. Tornado IOStream
  11. Tbase 源码 (二)
  12. fgui的ui管理框架_GitHub - zyswx/DCET: Unity3D客户端和.Net Core服务器双端框架,支持FGUI和双端行为树,支持代码全热更(包括FGUI和行为树)...
  13. P1084 [NOIP2012 提高组] 疫情控制
  14. 鸿蒙OS内核分析|解读鸿蒙源码
  15. Java String,看这篇就够了
  16. 小米音频测试软件,小米10 Pro成DXOMARK手机音频新榜首 雷军略显骄傲
  17. Python编辑基础课后习题(持续更新)
  18. 微信小程序wx.compressImage的坑
  19. python定义字符串_Python定义字符串、循环
  20. SSH远程ubuntu【无公网IP、内网穿透】 3-3

热门文章

  1. Felix: Flexible Text Editing Through Tagging and Insertion (2020-03)
  2. 大数据集合求交集_还记得学生时代数学老师教的“集合”吗?
  3. panda提取时间戳中的日期_Pandas处理时间序列数据的20个关键知识点
  4. vue中通过ref属性来获取dom的引用
  5. Radware;医疗行业数字转型5大关键注意事项
  6. Linux Namespace机制简介
  7. Qt使用教程之指定运行设置(三)
  8. 【SSO单点系列】(6):CAS4.0 单点流程序列图(中文版)以及相关术语解释(TGT、ST、PGT、PT、PGTIOU)...
  9. jsp中excel文件的创建与读取
  10. Myeclipse中web project 与java project区别