LeetCode:29. 两数相除

news/2024/11/24 10:10:21/

29. 两数相除

  • 1)题目
  • 2)思路
  • 3)代码
    • 1.初始代码
    • 2.第一次优化
    • 3.第二次优化
  • 4)结果
    • 1.初始结果
    • 2.第一次优化结果
    • 3.第二次优化结果

1)题目

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

整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8-2.7335 将被截断至 -2

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

注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−2^31, 2^31 − 1] 。本题中,如果商 严格大于 2^(31 − 1) ,则返回 2^(31 − 1) ;如果商 严格小于 -2^31 ,则返回 -2^31

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333… ,向零截断后得到 3 。

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333… ,向零截断后得到 -2 。

提示:

  • -2^31 <= dividend, divisor <= 2^(31 − 1)
  • divisor != 0

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2)思路

一开始是全部转成正数,后面发现比较麻烦,就采用全部转为负数这种方案。
代码优化思路:dividend = 100, divisor = 3
return i   1	2	4	8	16	32
divisor    3	6	12	24	48	96dividend = 96 + 3 = 991
输出:i = 32 + 1 = 33

3)代码

1.初始代码

直接循环相减

public static int divide(int dividend, int divisor) {// ------------ 前面的代码部分 ---------------if (dividend == 0) return 0;// 除数为1或-1if (divisor == 1) return dividend;if (divisor == -1) {if (dividend == Integer.MIN_VALUE) {return Integer.MAX_VALUE;}return -dividend;}// 除数等于被除数if (dividend == divisor) return 1;// 默认为正的boolean flag = true;// 全部转为负数if (dividend > 0) {dividend = -dividend;flag = !flag;}if (divisor > 0) {divisor = -divisor;flag = !flag;}// 被除数小于除数if (dividend > divisor) return 0;// ------------ 前面的代码部分 ---------------// ------------ 优化的代码部分 ---------------int i = 0;while (!(dividend > divisor)) {dividend -= divisor;++i;}// ------------ 优化的代码部分 ---------------return flag ? i : -i;
}

2.第一次优化

循环相减改良版

public static int divide2(int dividend, int divisor) {// 前面的代码同上// ------------ 优化的代码部分 ---------------int i = 1;int value = divisor;while (dividend - divisor <= value) {if (dividend - divisor <= divisor) {divisor += divisor;i += i;} else {divisor += value;++i;}}// ------------ 优化的代码部分 ---------------return flag ? i : -i;
}

3.第二次优化

采用递归方法

public static int divide(int dividend, int divisor) {// 前面的代码同上// ------------ 优化的代码部分 ---------------int i = divideValue(dividend, divisor, 0);// ------------ 优化的代码部分 ---------------return flag ? i : -i;
}private static int divideValue(int dividend, int divisor, int i) {if (dividend > divisor) return 0;int value = divisor;int num = 1;while (dividend - value <= value) {value += value;num += num;}i = num + divideValue(dividend - value, divisor, i);return i;
}

4)结果

1.初始结果

在这里插入图片描述

2.第一次优化结果

在这里插入图片描述

3.第二次优化结果

在这里插入图片描述


http://www.ppmy.cn/news/75997.html

相关文章

基于Freertos的ESP-IDF开发——7.WS2812B彩色灯循环

基于Freertos的ESP-IDF开发——7.WS2812B彩色灯循环 0. 前言1. WS2812B简介2. 完整代码3. 演示效果4. 其他FreeRtos文章 0. 前言 本节使用WS2812B实现彩灯循环 开发环境&#xff1a;ESP-IDF 4.3 操作系统&#xff1a;Windows10 专业版 开发板&#xff1a;自制的ESP32-WROOM-3…

Python关于Pandas的iterrows、itertuples等遍历表格时读取不到第一行的问题

一、问题原因 df.iterrows() 是用来遍历 Pandas DataFrame 的方法&#xff0c;它会把 DataFrame 中的每一行转换成一个元组&#xff0c;其中第一个元素是行号&#xff0c;第二个元素是该行的数据。行号从 0 开始。 在使用 df.iterrows() 遍历 DataFrame 的时候发现表格第二行…

CMD与DOS脚本编程【第六章】

预计更新 第一章. 简介和基础命令 1.1 介绍cmd/dos脚本语言的概念和基本语法 1.2 讲解常用的基础命令和参数&#xff0c;如echo、dir、cd等 第二章. 变量和运算符 2.1 讲解变量和常量的定义和使用方法 2.2 介绍不同类型的运算符和运算规则 第三章. 控制流程和条件语句 3.1 介…

组合数学第二讲

可以把取出来的数从小到大排序&#xff0c;第一个数不变&#xff0c;第二个数1&#xff0c;以此类推... 总共的情况为&#xff0c;数字取完后可再依次减回去&#xff0c;保证数在100以内 k-element multisets 引出下面的二项式系数 binomial coefficients&#xff08;二项式系…

FAT NTFS Ext3文件系统有什么区别

10 年前 FAT 文件系统还是常见的格式&#xff0c;而现在 Windows 上主要是 NTFS&#xff0c;Linux 上主要是Ext3、Ext4 文件系统。关于这块知识&#xff0c;一般资料只会从支持的磁盘大小、数据保护、文件名等各种维度帮你比较&#xff0c;但是最本质的内容却被一笔带过。它们最…

Glob 文件匹配

前言 glob本质是Unix shell 风格的路径匹配规则。 该规则后续被其它语言支持。 ?&#xff1a;匹配一个任意字符 *&#xff1a;匹配任意个任意字符 [sequence]&#xff1a;匹配出现在sequence里面的一个字符 [!sequence]&#xff1a;匹配没有出现在sequence里面的一个字符 [a…

Spark大数据处理讲课笔记---Spark RDD典型案例

零、本节学习目标 利用RDD计算总分与平均分利用RDD统计每日新增用户利用RDD实现分组排行榜 一、利用RDD计算总分与平均分 &#xff08;一&#xff09;提出任务 针对成绩表&#xff0c;计算每个学生总分和平均分 &#xff08;二&#xff09;实现思路 读取成绩文件&#xff…

java实现url链接的补全,获取到的链接是以/或 ./ 开头的相对链接,不是以http开头的,需要补全

一、实现的目标 在使用爬虫获取网页html数据时,解析到的链接是/或./ 开头的相对链接,不是以http开头的链接,如:/picture/0/cca65350643c441e80d390ded3975db0.png 。此时需要完成对该链接的补全,以得到正确的链接。 二、实现思路 对比完整的url链接和相对链接,进行分析,…