LeetCode 29. 两数相除

两数相除

给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。
整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。
返回被除数 dividend 除以除数 divisor 得到的 商 。
注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231, 231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。

看到题第一反应:这啥鬼,除法不是很简单,为啥要搞这么复杂
看了题解:牛,有点东西,思路很好很清奇

1.边界判断
此处假设除数不为0
被除数为0,结果必然为0
除数为1,结果为被除数
除数为-1时,一般情况只取反被除数就可以,但注意题目要求32位,范围是-2^31 ~ 2^31-1,假设被除数恰好是-2^31,那么取反后越界了,超过2^31-1,因此返回INT32_MAX

2.开始运算
方便期间,先标记结果的正负,然后吧所有数据转成正数处理,最后结果用标记处理正确即可
「快速乘」算法实现,类似快速幂算法,也是本体的核心,具体实现见代码

方法一、类二分查找

Swift

func divide(_ dividend: Int, _ divisor: Int) -> Int {//被除数为0if dividend == 0 {return 0}//除数为1if divisor == 1 {return dividend}if divisor == -1 {// 如果被除数比最小值还小,除以-1之后,就会比边界值还大,所以此时返回最大边界值,其他情况,返回相反数if dividend > Int(Int32.min) {return -dividend}return Int(Int32.max)}// 结果是否为正数let sign = dividend > 0 && divisor > 0 || dividend < 0 && divisor < 0let a = dividend > 0 ? dividend : -dividendlet b = divisor > 0 ? divisor : -divisorlet res = div(a, b)return sign ? res : -res}func div(_ a: Int, _ b: Int) -> Int {if a < b {return 0}var count = 1var result = bwhile result + result <= a {count += countresult += result}return count + div(a-result, b)}

OC

-(int32_t)divide:(int32_t)dividend divisor:(int32_t)divisor {if (dividend == 0) {return 0;}if (divisor == 1) {return dividend;}if (divisor == -1) {if (dividend > INT32_MIN) {return -dividend;}return INT32_MAX;}//结果正负标记bool isPositive = (dividend > 0 && divisor > 0) || ( dividend < 0 && divisor < 0);int32_t a = dividend > 0 ? dividend : -dividend;int32_t b = divisor > 0 ? divisor : -divisor;int32_t res = [self divide:a divisor:b];return isPositive ? res : -res;
}//「快速乘」算法
- (int32_t)divWithA:(int32_t)a b:(int32_t)b {if (a < b) {return 0;}int32_t count = 1;int32_t result = b;while (result + result <= a) {count += count;result += result;}return count + [self divWithA:a-result b:b];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux高级管理——Squid代理

一、squid服务基础&#xff1a; 1.1缓存代理的概述&#xff1a; 代理的工作机制 当客户机通过代理来请求Web页面时&#xff0e;指定的代理服务器会先检查自己的缓存&#xff0c;如果缓存中已经有客户机需要的页面&#xff0c;则直接将缓存中的页面内容反馈给客户机:如果缓存中…

web学习笔记(十一)

目录 1.数据类型 1.1数据类型分类 &#xff08;1&#xff09;简单&#xff08;基本&#xff09;数据类型 &#xff08;2&#xff09;复杂&#xff08;特殊&#xff09;数据类型 1.2判断数据类型的方法 &#xff08;1&#xff09;常规判断方法&#xff1a; &#xff08;2…

x-cmd pkg | trdsql - 能对 CSV、LTSV、JSON 和 TBLN 执行 SQL 查询的工具

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 trdsql 是一个使用 sql 作为 DSL 的强大工具: 采用 SQL 对 CSV、LTSV、JSON 和 TBLN 文件执行查询与 MySQL&#xff0c;Postgresql&#xff0c;Sqlite 的 Driver 协同&#xff0c;可以实现对应数据库的表与文件的 JO…

Kafka_02_Producer详解

Kafka_02_Producer详解 ProducerProducerRecordSend&Close实现原理ProducerInterceptorSerializerPartitioner 事务 Producer Producer(生产者): 生产并发送消息到Broker(推送) Producer是多线程安全的(建议通过池化以提高性能)Producer实例后可发送多条消息(可对应多个P…

2024--Django平台开发-Django知识点(四)

1.知识回顾 创建项目&#xff1a;新项目、别人项目、新版版、老版本 项目目录&#xff08;v1.0版本&#xff09; 路由系统 常见路由编写加粗样式 /index/ 函数 /index/<str:v1> 函数 re_path(ryy/(\d{4})-(\d{2})-(\d{2})/, views.yy), re_path(ryy/(?…

科研上新 | 第4期:语言-音乐对比预训练;查找表实现的神经网络推理;大模型时代重新定义搜索框架

编者按&#xff1a;欢迎阅读“科研上新”栏目&#xff01;“科研上新”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里&#xff0c;你可以快速浏览研究院的亮点资讯&#xff0c;保持对前沿领域的敏锐嗅觉&#xff0c;同时也能找到先进实用的开源工具。 本期内容速览 …

什么是ajax,为什么使用ajax!

前言&#xff1a; 要学习一门新的、技术之前&#xff0c;首先我们要了解一下他是什么&#xff0c;为什么使用&#xff0c;有什么好处&#xff0c;该怎么理解。现在就从下文开始了解吧 什么是ajax: Ajax即“Asynchronous Javascript And XML”(异步JavaScript 和XML)&#xff0…

监控API的指标

监控服务器已经是常态了&#xff0c;但是监控API的表现是啥意思呢&#xff1f;还有监控指标&#xff1f;今天就来看看如何监控API。 正如监控应用程序以确保高质量性能一样&#xff0c;也必须监控API。 API是应用程序相互通信的管道。更具体地说&#xff0c;API提供了一种方法…

spring事务默认传播机制REQUIRED的试验(手动开启事务代码+feign远程调用)

transactional注解&#xff0c;默认啥都不指定的时候&#xff0c;我们使用的就是PROPAGATION_REQUIRED这种方式。 PROPAGATION_REQUIRED:业务方法需要在一个事务中运行&#xff0c;如果方法运行时&#xff0c;已处在一个事务中&#xff0c;那么就加入该事务&#xff0c;否则自…

C++20新特性解析:深入探讨协程库的实现原理与应用

C20新特性解析&#xff1a;深入探讨协程库的实现原理与应用 一、C20的协程库简介二、C20协程基础知识2.1、协程的基本概念和使用方法2.2、C20中的协程支持2.3、协程与传统线程的对比 三、C20协程库的实现原理四、C20协程库的应用实例总结 一、C20的协程库简介 C20引入了对协程…

特种印制电路技术

1特种印制电路技术现状、分类及特点 2006年&#xff0c;信息产业部(现工信部)电子信息产品管理司将高档PCB产品类型概括为HDI板、多层FPC、刚挠结合板、IC载板、通信背板、特种板材印制板、印制板新品种等种类。但直至目前&#xff0c;在印制电路设计与制造领域还没有形成特种…

软件测试|深入理解SQL RIGHT JOIN:语法、用法及示例解析

引言 在SQL中&#xff0c;JOIN是一种重要的操作&#xff0c;用于将两个或多个表中的数据关联在一起。SQL提供了多种JOIN类型&#xff0c;其中之一是RIGHT JOIN。RIGHT JOIN用于从右表中选择所有记录&#xff0c;并将其与左表中匹配的记录组合在一起。本文将深入探讨SQL RIGHT …

Python Selenium常见的报错以及措施

Python Selenium的常见报错主要包括以下几种&#xff1a; 1. NoSuchElementException: 当Selenium无法在DOM中找到元素时&#xff0c;会抛出此异常。这通常是因为元素不存在或者页面还未完全加载。 解决方法&#xff1a; 显式等待 隐式等待 越快越慢&#xff0c;越慢越快&#…

C#,冒泡排序算法(Bubble Sort)的源代码与数据可视化

排序算法是编程的基础。 常见的四种排序算法是&#xff1a;简单选择排序、冒泡排序、插入排序和快速排序。其中的快速排序的优势明显&#xff0c;一般使用递归方式实现&#xff0c;但遇到数据量大的情况则无法适用。实际工程中一般使用“非递归”方式实现。本文搜集发布四种算法…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第二天-Linux开发板外设练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

并发(6)

目录 31.JUC框架包含几个部分&#xff1f; 32.Lock框架和Tools包含哪些核心的类&#xff1f; 33.JUC原子类有哪些核心的类&#xff1f; 34.JUC线程池有哪些核心的类&#xff1f; 35.线程安全的实现方法有哪些&#xff1f; 31.JUC框架包含几个部分&#xff1f; 主要包含&am…

SpringCloud-高级篇(十三)

前面的主从集群可以应对Redis高并发读的问题&#xff0c;Redis主从之间可以做同步&#xff0c;为了提高主从同步时的性能&#xff0c;单节点Redis的内存不要设置太高&#xff0c;如果内存占用过多&#xff0c;做RDB的持久化&#xff0c;或者做全量同步的时候&#xff0c;导致大…

LDD学习笔记 -- Linux错误码

LDD学习笔记 -- Linux错误码 EACCES(Permission Denied) 13EEXIST(File Exits) 17EINVAL(Invalid Argument) 22ENOENT(No Such File or Directory)ENOMEM(Out of Memory)EIO(Input/Output Error) 5ENOSPC(No space Left on Device)ENOTTY(Not a Typewrite)EPIPE(Broken Pipe)EI…

使用邮箱发送验证码前端完成登录

前言 在前一篇使用C#发送邮箱验证码已经完成使用.net core web api写了完成往登录邮箱发送验证码的接口。现在就用前端调用接口模拟登录功能。 接口 public class ApiResp{public bool Success { get; set; }public int Code { get; set; }public int count { get; set; }pu…

元数据管理平台对比预研 Atlas VS Datahub VS Openmetadata

大家好&#xff0c;我是独孤风。元数据管理平台层出不穷&#xff0c;但目前主流的还是Atlas、Datahub、Openmetadata三家&#xff0c;那么我们该如何选择呢&#xff1f; 本文就带大家对比一下,这三个平台优势劣势。要了解元数据管理平台&#xff0c;先要从架构说起。 正文共&am…