1. Divide Two Integers

Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.
Return the quotient after dividing dividend by divisor.
The integer division should truncate toward zero.

Example 1:

Input: dividend = 10, divisor = 3
Output: 3

Example 2:

Input: dividend = 7, divisor = -3
Output: -2

Note:

  • Both dividend and divisor will be 32-bit signed integers.
  • The divisor will never be 0.
  • Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows.

简单来说就是不用‘乘法’、‘除法’和‘取余’运算来求两个整数的商,注意结果要在 [−231, 231 − 1]

Round One

  • 暴力减法(如下),我赌5毛,超时(Time Limit Exceeded)!
// Swift Code
class Solution {
func divide(_ dividend: Int, _ divisor: Int) -> Int {
let sign = (dividend >= 0) == (divisor > 0) ? 1 : -1
var dividend = abs(dividend)
let divisor = abs(divisor)
var result = 0
while dividend > divisor {
dividend -= divisor
result += 1
}
if dividend == divisor {
result += 1
}
return sign < 0 ? -result : result
}
}

  

Round Two

一个一个减肯定是超时了,要是一批一批减呢?
所以就需要先成倍放大被除数,不允许用‘乘法’、‘除法’和‘取余’ 还有 ‘<<’、‘>>’
这个方法耗时少于超越了100%的其它Swift提交

// Swift Code
class Solution {
func divide(_ dividend: Int, _ divisor: Int) -> Int {
// 除数、被除数符号不一致时候商为负数
let sign = (dividend >= 0) == (divisor > 0) ? 1 : -1 // 扩大下数据类型,避免溢出
var _dividend = Int64(abs(dividend))
let _divisor = Int64(abs(divisor)) var result = 0
var temp = 1
var _divisor_temp = _divisor // 放大被除数
while _divisor_temp < _dividend {
_divisor_temp = _divisor_temp << 1
temp = temp << 1
} // 在合理范围内缩小被放大的被除数
while _divisor_temp > 0, _divisor_temp > _divisor {
while _divisor_temp > _dividend {
_divisor_temp = _divisor_temp >> 1
temp = temp >> 1
}
_dividend -= _divisor_temp
result += temp
} // 竟然一样大,所以再来一次了
if _dividend == _divisor {
result += 1
} // 结果是有范围限制的
return sign < 0 ? max(-result, Int(Int32.min)) : min(result, Int(Int32.max))
}
}

  

TestCase

// Swift Code
assert(Solution().divide(10, 3) == 3)
assert(Solution().divide(3, 3) == 1)
assert(Solution().divide(1, 1) == 1)
assert(Solution().divide(2, 3) == 0)
assert(Solution().divide(7, -3) == -2)
assert(Solution().divide(-2147483648, -1) == 2147483647)
assert(Solution().divide(0, 2147483648) == 0)

最新文章

  1. django之一些feature
  2. ZeroMQ接口函数之 :zmq_setsockopt –设置ZMQ socket的属性
  3. SOJ 1717 Computer (单机任务调度)
  4. jQuery实例——jQuery实现联动下拉列表查询框--转http://www.cnblogs.com/picaso/archive/2012/04/08/2437442.html#undefined
  5. centos 安装 nginx
  6. Spring事务解析4-切面织入
  7. Linux系统编程-setitimer函数
  8. ofbiz进击 第六节。 --OFBiz配置之[widget.properties] 配置属性的分析
  9. NetCore第一步:千里之行 始于环境构筑
  10. sar
  11. Rikka with Chess(规律)
  12. Android调用系统关机与重启功能
  13. 三种字符编码:ASCII、Unicode和UTF-8
  14. loadrunner工作原理
  15. 直方图均衡化C++实现
  16. 关于HTML5新手应该知道的几点知识
  17. python3全栈开发-多进程的守护进程、进程同步、生产者消费者模式(重点)
  18. 通用redis命令
  19. [SQL]Temporal 异常处理经验
  20. webpack打包去除map文件及其他一些配置

热门文章

  1. .net core mvc启动顺序以及主要部件1
  2. 完整的MVC框架(前端、后台和数据库)
  3. Sentinel实现Redis高可用
  4. Solidworks如何绘制文字
  5. Android使用procrank和dumpsys meminfo 、top分析内存占用情况
  6. 记录:50多行程序中找出多写的一个字母e
  7. actionbar tab 字体大小设置
  8. 【hdu】Mayor&amp;#39;s posters(线段树区间问题)
  9. Python常用的包
  10. openwrt 模拟i2c驱动(一)