LeetCode的一个题目 Divide Two Integers

(LeetCode) Divide Two Integers (Java)思路讲解及实现 本文将详细介绍Divide Two Integers 的解题思路及Java实现。 题目如下: Divide two integers without using multiplication, division and mod operator. (在不使用乘法,除法和取余操作的情况下实现整数的除法运算) If it is overflow, return MAX_INT.(整型 阅读详情

昨天开始刷LeetCode,刚开始做的几个题都没有问题,思路都很流畅,知道遇到了Divide Two Integers这个题目。

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

If it is overflow, return MAX_INT.

题目的描述很简单,就是在不使用乘法、除法和模运算的情况下实现两个整数的除法。

看到这个题目我首先想到的思路是除数一直相加,直到大于被除数,那么相加的次数减1就是我们需要的结果。代码如下:

	public static int divide(int dividend,int divisor){		
		int MAX_INT = 2147483647;
		boolean isReverse = false;
		int mDividend = dividend;
		int mDivisor = divisor;
		if(dividend<0){
			isReverse = !isReverse;
			mDividend = -dividend;
		}
		if(divisor<0){
			isReverse = !isReverse;
			mDivisor = -divisor;
		}
		if(mDividend==0)
			return 0;
		if(mDivisor==0)
			return MAX_INT;
		int result = 1;
		int tmp = mDivisor;
		while (!(mDividend<=tmp)) {
			result++;
			tmp+=mDivisor;
		}
		if(tmp>mDividend)
			result--;
		if(isReverse)
			result = -result;
		return result;
	}
因为考虑到负数的问题,所以显得比较繁琐,事实上核心代码并没有很复杂。但是,在代码提交时报了

Time Limit Exceeded
仔细思考发现,这样子做效率确实比较低,假设被除数是max_int 2147483647,除数是1,那么我们就需要加2147483647次才能得到结果,效率太低了!

那么该如何提高效率呢?二分法。以前每次都是加除数,知道大于除数,假如使用二分法的话,40/2,那么我们2+2<40,4+4<40,8+8<40,16+16<40,32+32>40,再对40-32=8重复上述操作,则可以得到结果。代码如下

	/**
	 * 二分法
	 * @param dividend 被除数
	 * @param divisor 除数
	 * @return
	 */
	public static int divide(int dividend,int divisor){
		int result = 0;
		int MAX_INT = 2147483647;
		boolean isReverse = false;
		if(dividend<0){
			isReverse = !isReverse;
			dividend = -dividend;
		}
		if(divisor<0){
			isReverse = !isReverse;
			divisor = -divisor;
		}
		if(dividend==0)
			return 0;
		if(divisor==0)
			return MAX_INT;
		int tmp = divisor;
		int tmpResult = 1;
		int remainder = dividend;
		while (remainder>=divisor) {
			tmp = divisor;
			tmpResult = 1;
			while ((tmp+tmp)<=remainder) {
				tmp = tmp+tmp;
				tmpResult = tmpResult+tmpResult;
			}
			remainder = remainder - tmp;
			result = result +tmpResult;
		}
		if(isReverse)
			result = -result;
		return result;
	}
但是!但是!!使用二分法还超时!!!使用二分法了你还报超时!效率都已经提高那么多了!!!

天哪!!到底该怎么搞啊?莫非真的要使用位运算吗???如何搞啊????莫非要让我用位运算重新实现一次除法吗?????

好吧,我的错,主要是越界问题没考虑清楚。注意:有可能tmp+tmp越界,同时,当值为-2147483648时,对他取反也会有越界问题。bug修复完成后代码如下:

	/**
	 * 二分法
	 * 我操,越界问题太蛋疼。
	 * @param dividend 被除数
	 * @param divisor 除数
	 * @return
	 */
	public static int divide(int dividend,int divisor){
		long result = 0;
		int MAX_INT = 2147483647;
		boolean isReverse = false;
		long mDividend = dividend;
		long mDivisor = divisor;
		if(dividend<0){
			isReverse = !isReverse;
			mDividend = -mDividend;
		}
		if(divisor<0){
			isReverse = !isReverse;
			mDivisor = -mDivisor;
		}
		if(mDividend==0)
			return 0;
		if(mDivisor==0)
			return MAX_INT;
		long tmp = mDivisor;
		long tmpResult = 1;
		long remainder = mDividend;
		while (remainder>=mDivisor) {
			tmp = mDivisor;
			tmpResult = 1;
			while ((tmp+tmp)<=remainder) {
				tmp = tmp+tmp;
				tmpResult = tmpResult+tmpResult;
			}
			remainder = remainder - tmp;
			result = result +tmpResult;
		}
		if(isReverse)
			result = -result;
		if(result>0&&(int)result<0){
			return MAX_INT;
		}
		return (int) result;
	}

Accepted!

Spring Authorization Server 实战指南:构建企业级 OAuth2/OIDC 授权中心 本文介绍了Spring Authorization Server作为构建企业级OAuth2/OIDC授权中心的解决方案。首先分析了传统认证模式的不足和OAuth2/OIDC协议的优势,然后详细讲解了如何从零搭建授权服务器,包括核心配置类、授权流程、数据库持久化等关键实现。文章还涵盖了资源服务器配置、客户端应用集成、安全最佳实践以及生产环境部署建议,完整呈现了Spring Authorization Server的核心功能和使用场景。通过本教程,开发者可以掌握统一认证授权系统的构建方法,为微服务架构提供安全可 阅读详情

相关推荐

SCS 43. 利用Scissor算法从单细胞数据中挖掘临床表型关联的细胞亚群

本文详细介绍了Scissor算法在单细胞转录组数据分析中的应用,该算法能够精准挖掘与临床表型关联的细胞亚群。通过建立单细胞RNA测序数据与临床预测模型的直接关联,Scissor避免了传统聚类方法的局限性,为疾病机制研究和个性化医疗提供了新工具。文章还涵盖了数据预处理、模型选择、结果验证等实战技巧。

weixin_28736335的博客 493

Divide Two Integers

每日算法——leetcode系列问题 Divide Two IntegersDifficulty: Medium Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT. class Solution { public:

zhanghuazhong444的博客 381

高阶玩法——Dify生成的数据自动写入mysql数据库

采用自定义工具方式,利用 python编写一个服务sql_save_post,将接收到的内容写入指定数据库的表中,并为该服务撰写一个 OpenAPI 的 schema。配置工作流:我们以写入天气预报为例,在生成天气预报内容后,连接自定义工具“sql_save_post”,将所需的字段配置完成后,实现将生成的内容自动写入mysql数据库中。编写OpenAPI的schema:在dify平台的工具栏目,创建自定义工具,输入工具名称“sql_save_post”。工具:sql_save_post;

qq_44493378的博客 8541

Substring with Concatenation of All Words & Median of Two Sorted Arrays & Divide Two Integers

(1) Substring with Concatenation of All Words

文森的学术之路 509

IC设计效率翻倍!Verilog-mode的AUTOWIRE/AUTOINST组合使用技巧

本文详细介绍了在Emacs的verilog-mode插件中,如何组合使用AUTOWIRE与AUTOINST功能,实现Verilog代码的智能自动化连接与维护。通过声明式编程思想,该组合能自动生成模块实例化连接和线网声明,并配合AUTO_TEMPLATE处理复杂映射,从而大幅提升IC顶层设计的效率和可靠性,减少手动连线的错误。

weixin_28826545的博客 320

详解k-means++

一、概述 定义:k-means++是一种为k-means聚类算法选择初始值(或“种子”)的算法。它是NP-hard k-means问题的一种近似算法,它是一种避免标准k-means算法有时发现的较弱聚类的方法。 K-means与K-means++:原始K-means算法最开始随机选取数据集中K个点作为聚类中心,而K-means++按照如下的思想选取K个聚类中心:假设已经选取了n个初始聚类中心(0<n<K),则在选取第n+1个聚类中心时:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚

qq_42364307的博客 3万+

C语言力扣第29题之两数相除。位运算

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2示例 1:输入: dividend = 10, divisor = 3 输出 : 3 解释 : 10 / 3 = truncate(3.33333..) = tru

欢迎交流! 763

基于STM32设计的环境监测系统(华为云IOT)_300

随着空气污染问题日益严峻,环境空气质量的监测变得愈加重要。为了解决这一问题,本项目设计并实现了一款基于STM32的空气质量监测设备,能够实时监测空气中的温湿度、二氧化碳浓度和甲醛浓度,并通过OLED显示屏展示数据。此外,设备支持通过WIFI模块将数据上传至云端,用户可以通过手机APP或Windows上位机查看实时数据。设备采用MQTT协议与华为云IOT物联网服务器进行数据通信,确保数据的实时性和可靠性。本项目还结合了低功耗设计和高灵敏度传感器,使得设备能够高效稳定地运行,并实现远程监控功能。

697

LeetCode 基本四则运算类题目总结

2. Add Two Numbers    题意:给出两个非空的链表代表两个非负数,每位数字再链表中逆序存放。    思路1:将链表各个数读出来,存到两个int里,最后相加得出答案,再转化为链表返回。问题:数据容易超出范围,遇到这种特地不用整型表示的题应该快速想到这一点。    思路2:创建链表,直接计算,各位相加,并控制进位,最终每位数都读取完了就返回。题目中特地黑体强调了逆序存放数字,让人很想...

qq_38345430的博客 2202

PrimeTime low power-多电压设计流程(2)

get_power_switches`、`get_supply_nets` 和 `get_supply_ports` 命令的操作方式类似,并具有类似的命令选项。PrimeTime 根据 UPF 命令构建电源供应网络,包括 create_power_domain、create_supply_net、create_supply_set、create_supply_port、set_domain_supply_net 和 connect_supply_net。电源集句柄是为电源域隐式创建的一个抽象电源集。

QRBQ 712

PyQt5开发编译器安装(PyCharm安装)

PyCharm 提供了最完整的 PyQt5 开发体验,特别是其集成的调试工具和 Qt Designer 支持,能显著提高开发效率。是最受欢迎和功能最完整的 IDE。它专门为 Python 开发优化,对 PyQt5 有很好的支持。右键运行该文件,如果出现窗口说明配置成功。对于 PyQt5 开发,

啊渊的专栏 419

leetcode 解题记录

leetcode 解题记录 11. Container With Most Water 题目描述 Given n non-negative integers a1, a2, …, an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoin...

lllunaticer的博客 308

AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研

在当今的人工智能时代,大模型技术的迅猛发展为各行各业带来了前所未有的变革。这些大模型,以其强大的语言理解和生成能力,正在逐步成为智能化应用的核心。然而,如何高效地利用这些大模型,构建出满足各种需求的应用,仍然是一个具有挑战性的问题。DB-GPT,作为一个开源的AI原生数据应用开发框架,应运而生,旨在简化大模型应用的开发过程,让构建智能化应用变得触手可及。本文将深入介绍DB-GPT的核心功能、关键特性,并通过实战操作,展示如何利用DB-GPT进行数据应用开发。DB-GPT是一个开源的AI原生数据应用开发框架。

寻道AI,探索AI无限可能! 1万+

Leetcode二分查找类题目

278. First Bad Version:Easy。注意位运算符优先级。 230.Kth Smallest Element in a BST:Medium。利用二叉查找树的特点。 35. Search Insert Position:Medium。lower_bound。 153. Find Minimum in Rotated Sorted Array & 旋转数组的最小数字:Medium。很

Bryan要加油 3384

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Crack LeetCode 之 29. Divide Two Integers

https://leetcode.com/problems/divide-two-integers/ 本题的O(log(n))解法请参考:https://blog.youkuaiyun.com/linhuanmars/article/details/20024907  

tassardge的专栏 157

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Go-Python-Java-C-LeetCode高分解法-第五周合集

本题解Go语言部分基于 [LeetCode-Go](https://github.com/halfrost/LeetCode-Go) 其他部分基于本人实践学习

记录我的学习历程 791

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【算法设计作业】week5

1.Divide Two Integers 来源:https://leetcode.com/problems/divide-two-integers/description/ 题意 给出两个int数a,b,要求计算他们的商,不能使用乘、除、取模。 思路 很直接想法按照除法的定义,当a,b都大于0时,a不断减b,直到余数比b小,记录一共减了多少次,就是所求的答案。但是这样...

LoHiauFung的博客 458

leetcode题解第29题 Divide Two Integers (两数相除)

题目的大意如下: 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。 简单来说,就是需要在不借助python内部的乘、除、去余运算的情况下,实现整数除法运算,并返回运算的商的。余数忽略。 且在此之外,还有几点额外说明: 除数永远不会为0。 被除数和除数都是32位...

笔墨留年。 773

Leetcode 29. Divide Two Integers

方法1: 这道题最tricky的地方就在于我们把要把两个数都变为负数来操作,因为负数的范围大,不会stackoverflow. 还有就是我们最先想到的肯定是每次剪去被除数,最后看看一共被减了多少个被除数。但是这样的方法太慢了,优化方法看lc官方解答2,他这个方法每次不是固定都减去被除数,被减的数是成倍在增加的。这样我们整个算法就会省去很多时间。时间复杂logn*logn,具体时间复杂的解释看lc官方解释,解释的很清楚。空间复杂1. class Solution { private static i.

GoodJobJasper的博客 232

图解LeetCode:Divide Two Integers

文章目录我的思路算法优化代码实现总结 这是LeetCode的第29号题目,Divide Two Integers,题目要求计算两个数相除是多少,最后返回整数就可以。 比如给定10和4,那10/4是2;给定7和-3,那么7/(-3)应该返回2,题目要求不能用乘法、除法和取余操作。如果在面试时遇到这个题目该怎么求解呢?   我的思路 首先我们可以将除数和被除数都转为正数以简化操作,而对于除法...

码农的荒岛求生 398

Divide Two Integers -- LeetCode

原题链接: http://oj.leetcode.com/problems/divide-two-integers/  这道题属于数值处理的题目,对于整数处理的问题,在Reverse Integer中我有提到过,比较重要的注意点在于符号和处理越界的问题。对于这道题目,因为不能用乘除法和取余运算,我们只能使用位运算和加减法。比较直接的方法是用被除数一直减去除数,直到为0。这种方法的迭代次数是结

Code Ganker 3万+

Leetcode 29 —— Divide Two Integers

29. Divide Two Integers My Submissions Question Total Accepted: 62780 Total Submissions: 403300 Difficulty: Medium Divide two integers without using multiplication, division and mo

decode 1042

leetcode记录29. Divide Two Integers

29. Divide Two Integers √ Accepted √ 989/989 cases passed (4 ms) √ Your runtime beats 100 % of cpp submissions √ Your memory usage beats 99.38 % of cpp submissions (8.3 MB) /* * @lc app=leetc...

我的博客 196

leetcode学习笔记29 Divide Two Integers

leetcode学习笔记29问题方法1方法2 问题 leetcode Two Sum 方法1 时间复杂度O(n2)O(n^{2})O(n2). 空间复杂度O(1)O(1)O(1). 方法2 时间复杂度O(n)O(n)O(n). 空间复杂度O(n)O(n)O(n).

kuma的博客 281

LeetCode:29. Divide Two Integers

LeetCode:29. 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 d...

Wisimer 182

leetcode 29 - Divide Two Integers

leetcode题目汇集 - Divide Two Integers leetcode 29 - Divide Two Integers 题目要求 Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT. 思

知足常乐,知行合一 275
上一篇: ImageButton focusable="false"不起作用
下一篇: LeetCode java实现Add Two Numbers
Unknown_unknown
博客等级 码龄14年 13粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值