力扣题目——29. 两数相除
注:本文的代码实现使用的是 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. 两数相除相关推荐
- 力扣题目——653. 两数之和 IV - 输入 BST
注:本文的实现思路主要是基于JS(JavaScript),涉及到的一些函数都是JS中的自带函数 题目描述 给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给 ...
- 力扣题目——1. 两数之和
注:本文的实现思路主要是基于JS(JavaScript),涉及到的一些函数都是JS中的自带函数 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 t ...
- LeetCode高频题29. 两数相除:不用加减乘除号,求加法,减法,乘法,除法
LeetCode高频题29. 两数相除 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批ACM竞赛 ...
- Java实现 LeetCode 29 两数相除
29. 两数相除 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商 ...
- leetcode 29.两数相除
leetcode 29.两数相除 题目描述 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 ...
- LeetCode-中等-29. 两数相除
LeetCode-中等-29. 两数相除 题目 引用自:LeetCode-中等-29. 两数相除(如有侵权联系删除) 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不 ...
- LeetCode 29. 两数相除(位运算)
1. 题目 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示 ...
- leetcode —— 29. 两数相除
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 整数除法的结果 ...
- ※29. 两数相除(java)
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.返回被除数 dividend 除以除数 divisor 得到的商.整数除法的结果应当 ...
最新文章
- 富交互Web应用中的撤销和前进
- 【Python合集】全面掌握Python基础知识,建议收藏
- Amoeba for MySQL
- Docker自动补全容器名
- python 找质数的个数_用Python打造一款文件搜索工具,所有功能自己定义!
- document.body.scrollTop用法
- 2016-03-17 leaks 内存泄露
- matlab2c使用c++实现matlab函数系列教程-ones函数
- docker安装es+kibana
- Tornado IOStream
- Tbase 源码 (二)
- fgui的ui管理框架_GitHub - zyswx/DCET: Unity3D客户端和.Net Core服务器双端框架,支持FGUI和双端行为树,支持代码全热更(包括FGUI和行为树)...
- P1084 [NOIP2012 提高组] 疫情控制
- 鸿蒙OS内核分析|解读鸿蒙源码
- Java String,看这篇就够了
- 小米音频测试软件,小米10 Pro成DXOMARK手机音频新榜首 雷军略显骄傲
- Python编辑基础课后习题(持续更新)
- 微信小程序wx.compressImage的坑
- python定义字符串_Python定义字符串、循环
- SSH远程ubuntu【无公网IP、内网穿透】 3-3
热门文章
- Felix: Flexible Text Editing Through Tagging and Insertion (2020-03)
- 大数据集合求交集_还记得学生时代数学老师教的“集合”吗?
- panda提取时间戳中的日期_Pandas处理时间序列数据的20个关键知识点
- vue中通过ref属性来获取dom的引用
- Radware;医疗行业数字转型5大关键注意事项
- Linux Namespace机制简介
- Qt使用教程之指定运行设置(三)
- 【SSO单点系列】(6):CAS4.0 单点流程序列图(中文版)以及相关术语解释(TGT、ST、PGT、PT、PGTIOU)...
- jsp中excel文件的创建与读取
- Myeclipse中web project 与java project区别