Python世界:力扣29题两数相除算法实践

news/2024/9/18 15:07:32/ 标签: 算法, python, leetcode

Python世界:力扣29题两数相除算法实践[

    • 任务背景
    • 实现思路
      • 模拟思路
      • 编码实现
    • 本文小结

任务背景

本问题来自于力扣29题,在做完大数相乘后,顺带也看下两数相除。

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

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

注意提示:目的就是提醒越界问题:-2^31/-1=2&31,超过了整数表达范围。

实现思路

模拟思路

  • 问题核心:只用减法,拼凑,直到小于除数
  • 简化问题:不考虑正负,只考虑纯正数

编码实现

功能函数:

python">def get_sign(num: int) -> int:sign_num = 1if num < 0:sign_num = -1return sign_numclass Solution:def divide(self, dividend: int, divisor: int) -> int:# 注意处理两者的输入边界,负号取绝对值存在溢出的问题。dividendabs_dvd = abs(dividend)abs_dvs = abs(divisor)sign_dvd = get_sign(dividend)sign_dvs = get_sign(divisor)# corner caseif dividend == 0 or abs_dvd < abs_dvs:return 0if divisor == 1:return dividendif (divisor == -1):if (dividend != -2**31):return -dividendelse:return 2**31-1# 原始方法,耗时过大res = 0while (abs_dvd >= abs_dvs):abs_dvd -= abs_dvsres += 1if sign_dvd != sign_dvs:res *= -1return res

针对27-31行效率问题,倍增加法,加快收敛:

python">        # 优化版本res = 0sum_rm = 0 # 记录被减去的总数while (abs_dvd >= abs_dvs + sum_rm): # 固定步长,移动sum_rmbig_step = abs_dvsbig_cnt = 1while (abs_dvd >= big_step + big_step + sum_rm):big_step += big_step # 移动步长big_cnt += big_cnt # 倍数步长sum_rm += big_step # 计入累积步长res += big_cnt # 计入累计步数

测试套编写:

python"># 导入单元测试
import unittest# 编写测试套
class TestSol(unittest.TestCase):def test_bound1(self):num1 = 7num2 = 1ret = 7sol = Solution()self.assertEqual(sol.divide(num1, num2), ret)def test_bound2(self):num1 = 7num2 = 7ret = 1sol = Solution()self.assertEqual(sol.divide(num1, num2), ret)def test_bound3(self):num1 = 2147483647num2 = -1ret = -2147483647sol = Solution()self.assertEqual(sol.divide(num1, num2), ret)def test_bound4(self):num1 = -2147483648num2 = -2147483648ret = 1sol = Solution()self.assertEqual(sol.divide(num1, num2), ret)def test_bound5(self):num1 = -2147483648num2 = -2ret = 1073741824sol = Solution()self.assertEqual(sol.divide(num1, num2), ret)def test_bound6(self):num1 = 2147483647num2 = 2ret = 1073741823sol = Solution()self.assertEqual(sol.divide(num1, num2), ret)def test_special1(self): # 负数极大值场景num1 = -2147483648num2 = -1ret = 2147483647sol = Solution()self.assertEqual(sol.divide(num1, num2), ret)def test_special2(self):num1 = -2147483648num2 = 1ret = -2147483648sol = Solution()self.assertEqual(sol.divide(num1, num2), ret)def test_common_case1(self):num1 = 7num2 = -3ret = -2sol = Solution()self.assertEqual(sol.divide(num1, num2), ret)def test_common_case2(self):num1 = 10num2 = -3ret = -3sol = Solution()self.assertEqual(sol.divide(num1, num2), ret)def test_common_case3(self):num1 = 10num2 = 3ret = 3sol = Solution()self.assertEqual(sol.divide(num1, num2), ret)

主调逻辑:

python"># 含测试套版本主调
if __name__ == '__main__':print('start!')unittest.main() # 启动单元测试print('done!')

本文小结

除法运算本质是减法,从理解原理到真正实现还是有距离,建议初步理解后,不参考任何代码,完全自己复现一遍,体会更深。

  • 先完成粗略的(核心的)
  • 再处理corner case
  • 再优化提效

参考资料

  1. LeetCode题目P29,两数相除
  2. P29题解参考

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

相关文章

Rocket: 从零开始构建Rust Web服务

1. Rocket框架简介 Rocket是Rust生态中一颗闪亮的新星&#xff0c;专为构建Web应用而生。作为一个现代化的Web框架&#xff0c;Rocket以其类型安全性、简洁的API和卓越的性能脱颖而出。无论你是想构建一个简单的静态网站&#xff0c;还是复杂的RESTful API&#xff0c;Rocket都…

【JavaSE系列】反射机制

目录 前言 一、概述 二、获取Class对象 三、反射构造方法 1. 获取构造方法 2. 获取修饰符、名称和形参 3. 创建对象 四、反射成员变量 1. 获取成员变量 2. 获取修饰符、名称和类型 3. 赋值/获取值 五、 反射成员方法 1. 获取成员方法 2. 获取修饰符、形参、返回值…

深度剖析去中心化存储:IPFS、Arweave 和 BNB Greenfield 的技术革新与生态系统演进

引言&#xff1a; 在数字时代的浪潮中&#xff0c;数据已然成为驱动创新和决策的核心资产。然而&#xff0c;随着数据量呈指数级增长&#xff0c;传统中心化存储模式面临着前所未有的挑战。安全漏洞、隐私泄露、数据垄断等问题日益凸显&#xff0c;促使技术界重新思考数据存储…

idea中java及java web项目的常见问题

1、乱码问题&#xff0c;主要有几处地方&#xff0c;需要检查。 ①确保文件编码&#xff0c;其实主要就是在idea启动文件中&#xff0c;增加了 -Dfile.encodingUTF-8的设置 ②编辑器默认编码&#xff0c;都改为UTF-8 ③Tomcat的运行配置&#xff0c;编码也改为UTF-8,同样使用…

创建一个 `systemd` 服务文件来管理 uWSGI 启动、停止和其他维护任务

编写 systemd 服务文件可以帮助你管理和自动化你的应用服务。在 CentOS 系统中&#xff0c;你可以创建一个 systemd 服务文件来管理 uWSGI 启动、停止和其他维护任务。下面是详细的步骤和示例。 ### 1. 创建服务文件 首先&#xff0c;在 /etc/systemd/system 目录下创建一个新…

linux-L5.linux查看应用占用的资源top

启动 top 命令&#xff1a; 打开终端&#xff0c;输入 top 并按回车键。 查看进程信息&#xff1a; 默认情况下&#xff0c;top 会显示系统的整体资源使用情况&#xff0c;包括 CPU、内存、磁盘 I/O 和网络 I/O 等信息。然后它会列出当前运行的进程&#xff0c;以及它们分别占…

vueCropper裁剪图片(不模糊)以及记录使用方法

需求&#xff1a;上传限定比例的图片。前端框架是vue3 element plus。 问题&#xff1a;使用vueCropper后比例固定。但是上传后的图片很模糊 vueCropper官网 解决办法 vueCropper中有一个full和high两个参数&#xff0c;记得开启 const options: any reactive({img: , // 原…

react 动画_样式处理

动画 在日常开发中&#xff0c;页面切换时的转场动画是比较基础的一个场景 当一个组件在显示与消失过程中存在过渡动画&#xff0c;可以很好的增加用户的体验 在 react中实现过渡动画效果会有很多种选择&#xff0c;如 react-transition-group&#xff0c; react-motion&…

如何利用 CSS 渐变实现多样化背景效果

前言 总在平常看到像这样的图片 背景是如何实现的呢 背景效果的多样性和美观性直接影响用户体验。CSS 渐变为设计师提供了一种强大且灵活的方法来创建引人注目的背景。渐变是颜色之间平滑过渡的效果&#xff0c;通过调整渐变类型和设置&#xff0c;你可以轻松实现从简单到复杂…

全面认识AI Agent:一文读懂AI智能体的架构指南

在人工智能的快速发展中&#xff0c;AI Agent&#xff08;人工智能代理或智能体&#xff09;正逐渐成为研究和应用的热点。AI Agent不仅仅是一个简单的自动化工具&#xff0c;它能够感知环境、做出决策&#xff0c;并执行任务以实现特定的目标。本文将详细介绍AI Agent的概念、…

华为OD机试 - 开源项目热度榜单(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

算法手撕面经系列(1)--手撕多头注意力机制

多头注意力机制 一个简单的多头注意力模块可以分解为以下几个步骤&#xff1a; 先不分多头&#xff0c;对输入张量分别做变换&#xff0c;得到 Q , K , V Q,K,V Q,K,V对得到的 Q , K , V Q,K,V Q,K,V按头的个数进行split&#xff1b;用 Q , K Q,K Q,K计算向量点积考虑是否要添…

mac 电脑 git credential osxkeychain问题之二

git credential osxkeychain问题&#xff0c;无法拉取最新代码&#xff0c;failed to get:-128 此处应输入电脑登录密码 1.问题描述 不知道是系统还是brew进行了更新&#xff0c;启动项目后 git pull 无法拉取最新代码&#xff0c;git项目git pull 操作时突然提示&#xff1a;…

【uni-app】命令行创建 uni-app 项目

命令行创建 uni-app 项目 优势 通过命令行创建 uni-app 项目&#xff0c;不必依赖 HBuilderX&#xff0c;TypeScript 类型支持友好。 命令行创建 uni-app 项目&#xff1a; vue3 ts 版 &#x1f449;国内 gitee 下载github 下载 # 通过 git 从 gitee 克隆下载 git clone…

使用 PyCharm 新建 Python 项目详解

使用 PyCharm 新建 Python 项目详解 文章目录 使用 PyCharm 新建 Python 项目详解一 新建 Python 项目二 配置环境1 项目存放目录2 Python Interpreter 选择3 创建隔离环境4 选择你的 Python 版本5 选择 Conda executable 三 New Window 打开项目四 目录结构五 程序编写运行六 …

基于单片机的水产养殖饲料自动投喂系统

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图系统框架图设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机…

Qt, 堆栈窗体, 布局管理, 控件插入, 子布局插入

StackDlg(QWidget *parent 0); ~StackDlg(); private: } ; QListWidget *list; QStackedWidget *stack; Qlabel *labell; QLabel *label2; Qlabel *label3; 在文件开始部分添加以下头文件&#xff1a; #include <QListWidget> #include <QStackedWidget>…

C# WinForm 中 DataGridView 实现单元格cell 能进编辑状态但是不能修改单元格的效果

在Windows Forms&#xff08;WinForms&#xff09;开发中&#xff0c;DataGridView 控件是一个功能强大的组件&#xff0c; 用于显示和管理表格数据。无论是展示大量数据&#xff0c;还是实现交互式的数据操作&#xff0c; DataGridView 都能提供多样的功能支持&#xff0c;比如…

弘扬中华优秀传统文化

中华优秀传统文化是中华民族的宝贵财富。在新时代&#xff0c;弘扬中华优秀传统文化具有重要意义。本文将探讨如何传承和弘扬中华优秀传统文化。 一、中华优秀传统文化的内涵 传统美德&#xff1a;仁、义、礼、智、信等传统美德是中华民族的精神支柱。 文学艺术&#xff1a;诗…

苹果CMS影视程序被举报侵权?有效解决方案指南

在当今数字时代&#xff0c;影视版权问题成为了许多网站面临的主要挑战。如果你使用苹果CMS进行影视内容管理&#xff0c;可能会遇到版权举报的问题。幸运的是&#xff0c;有一种有效的解决方案可以帮助你应对这些挑战——苹果CMS插件&#xff0c;它能够屏蔽原视频内容&#xf…