当前位置: 首页 > news >正文

LeetCode Divide Two Integers

原题链接在这里:https://leetcode.com/problems/divide-two-integers/

题目:

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

题解:

与Pow(x, n)类似.

从dividend里一个一个减divisor一直到余下的数小于divisor停止,算算一共减了多少个divisor, 就是答案。

但如此会超时,所以不能一个一个减掉divisor, 要减得更快. 可以把divisor呈指数增长. 若一空需要减掉k个divisor, k = 2^a+2^b+2^c. 表示公式就是dividend = divisor * (2^a+2^b+2^c);

e.g 28/3 => 28/3 = (2^3+2^0), answer = 2^3+2^0=9.

Note: 1. 这道题最火大的是overflow,不但要考虑Math.abs()时的溢出,因为Integer.MIN_VALUE 的绝对值 比 Integer.MAX_VALUE 的绝对值大一。

2. 还要考虑一种特殊的corner case: dividend = Integer.MIN_VALUE, divisor = -1, 此时res = Integer.MAX_VALUE +1,所以cast时会出错,要特殊处理。

3. 当以2的幂次方增长时,就用如下方式来写:

1 while(){
2     sum+=sum;
3     pow+=pow;
4 }

Time Complexity: O(logdivisor(dividend)). Space: O(1).

AC Java:

 1 public class Solution {
 2     public int divide(int dividend, int divisor) {
 3         if(divisor == 0){
 4             return Integer.MAX_VALUE;
 5         }
 6         boolean isNeg = (dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0);
 7         long res = 0;
 8         long a = Math.abs((long)dividend);
 9         long b = Math.abs((long)divisor);
10         
11         while(a >= b){
12             long sum = b;
13             long pow = 1;
14             while(sum + sum <= a){
15                 sum += sum;
16                 pow += pow;
17             }
18             a -= sum;
19             res += pow;
20         }
21         
22         res = isNeg ? (-res) : res;
23         if(res > Integer.MAX_VALUE){
24             return Integer.MAX_VALUE;
25         }
26         return (int)res;
27     }
28 }

 

转载于:https://www.cnblogs.com/Dylan-Java-NYC/p/4825036.html

相关文章:

  • iOS学习路线图
  • 阿里内推面试
  • ajax和json详解
  • ip地址合法性
  • Appium 的安装启动
  • thinkphp框架中处理标签中条件输出
  • CSS3实现图片循环旋转
  • TCP/IP详解 卷一(第十四章 DNS:域名系统)
  • Java连接Oracle数据库
  • JN5139 zigbee 资料
  • 洛谷1219 八皇后 解题报告
  • js获取url请求参数
  • poj 1840 Eqs
  • html中DIV+CSS与TABLE布局方式的区别及HTML5新加入的结构标签(转)
  • C#之#if #endif的简单用法
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • angular组件开发
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • HTTP--网络协议分层,http历史(二)
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript HTML DOM
  • Javascript编码规范
  • java中具有继承关系的类及其对象初始化顺序
  • js对象的深浅拷贝
  • opencv python Meanshift 和 Camshift
  • PHP那些事儿
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SpringBoot 实战 (三) | 配置文件详解
  • 大整数乘法-表格法
  • 关于 Cirru Editor 存储格式
  • 理清楚Vue的结构
  • 详解NodeJs流之一
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ​iOS实时查看App运行日志
  • !!java web学习笔记(一到五)
  • (1)Nginx简介和安装教程
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (poj1.3.2)1791(构造法模拟)
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (转)winform之ListView
  • (转)创业的注意事项
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .bashrc在哪里,alias妙用
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET命令行(CLI)常用命令
  • .NET中使用Redis (二)
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [2]十道算法题【Java实现】
  • [COI2007] Sabor
  • [FZSZOJ 1223] 上海红茶馆