Leetcod面试经典150题刷题记录 —— 数学篇

Leetcode面试经典150题刷题记录-系列
Leetcod面试经典150题刷题记录——数组 / 字符串篇
Leetcod面试经典150题刷题记录 —— 双指针篇
Leetcod面试经典150题刷题记录 —— 矩阵篇
Leetcod面试经典150题刷题记录 —— 滑动窗口篇
Leetcod面试经典150题刷题记录 —— 哈希表篇
Leetcod面试经典150题刷题记录 —— 区间篇
Leetcod面试经典150题刷题记录——栈篇
Leetcod面试经典150题刷题记录——链表篇
Leetcod面试经典150题刷题记录——二叉树篇
Leetcod面试经典150题刷题记录——二叉树层次遍历篇
Leetcod面试经典150题刷题记录——二叉搜索树篇

Leetcod面试经典150题刷题记录 —— 数学篇

    • 1. 回文数
      • 解法1 字符串解法
      • 解法2 官方解法
    • 2. 加一
    • 3. 阶乘后的零
      • 解法1
      • 解法2 考虑 [1,n] 中质因子 p 的个数。
    • 4. x 的平方根 (扩展了解 快速平方根算法)
    • 5. Pow(x,n)
    • 6. 直线上最多的点数

1. 回文数

题目链接:回文数 - leetcode
题目描述:
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
题目归纳:

解题思路:
解法: 回文数 - leetcode官方题解
(1)转换成字符串进行求解。比较原始字符串与反转字符串。
(2)将数字的每一位存储至一个双向队列中,依次比较队头和栈顶元素:回文数 - Pensive Albattanicrq题解
(3)官方题解。上面两种方式都要完整遍历整个数字的位数,而官方题解只需要遍历到其中一半的位置,并且从空间使用效率上来说更高效。时间复杂度是 O ( l o g n ) O(logn) O(logn) n n n是数字的大小, l o g n logn logn是指数字总共有几位,这应该不难理解。

解法1 字符串解法

class Solution:def isPalindrome(self, x: int) -> bool:mylist = list(str(x))while len(mylist) > 1:if mylist.pop(0) != mylist.pop():return Falsereturn True

解法2 官方解法

class Solution:def isPalindrome(self, x: int) -> bool:# 可以直接判断的特殊情况# (1)负数。不是回文数# (2)数值末尾为0,则开头也为0,那么只有0符合条件。if x < 0 or (x%10 == 0 and x != 0):return FalserevertX = 0while x > revertX:revertX = 10 * revertX + x % 10x //= 10# 位数为偶数个 or 位数为奇数个return x == revertX or revertX//10 == x

2. 加一

题目链接:加一 - leetcode
题目描述:
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
题目归纳:

解题思路:
解法: 加一 - leetcode官方题解

class Solution:def plusOne(self, digits: List[int]) -> List[int]:if len(digits) < 1: return [] # 空数组carry = 0 # 进位值digits = digits[::-1] # 翻转方便操作n = len(digits)p = 0while p < n:if p == 0: # 第1位数字要加1result = digits[0] + 1 + carrycarry = result // 10digits[0] = result % 10else:result = digits[p] + 0 + carrycarry = result // 10digits[p] = result % 10p += 1# 出来后若进位值carry仍大于0,数组需要append(carry)if carry > 0:digits.append(carry)return digits[::-1]

3. 阶乘后的零

题目链接:阶乘后的零 - leetcode
题目描述:
给定一个整数 n ,返回 n! 结果中尾随零的数量。提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1
题目归纳:

解题思路:
解法: 阶乘后的零 - leetcode官方题解
(1)因为 10 = 2 ∗ 5 10=2*5 10=25,求末尾0的个数,即是求 m i n ( 质因子 5 的个数 , 质因子 2 的个数 ) min(质因子5的个数, 质因子2的个数) min(质因子5的个数,质因子2的个数)
(2)再优化下,质因子 5 的个数不会大于质因子 2 的个数,

解法1

class Solution:def trailingZeroes(self, n: int) -> int:# 寻找阶乘的末尾有几个0# n! 尾0的个数即 n!中,因子10的个数,而10=2*5,因此转换成:求n!中质因子2的个数和质因子5的个数的较小值,即有多少个10参与了乘法,是由质因子2和5更小的那个数量来决定的# 质因子 5 的个数不会大于质因子 2 的个数# 而n!中质因子5的个数 = [1,n]的每个数的质因子5的个数之和,因此通过遍历[1,n]的所有5的倍数求出ans = 0for i in range(5, n+1, 5):while i%5 == 0: # (1)i要是5的倍数。i //= 5ans += 1    # (2)将i中质因子5的个数累加起来,比如25 = 5*5,两个质因数都为5return ans

解法2 考虑 [1,n] 中质因子 p 的个数。

class Solution:def trailingZeroes(self, n: int) -> int:# 仅考虑额外贡献的质因子个数 floor(n/p)# n 不变,p 越大,质因子个数越少,因此 [1,n] 中质因子 5 的个数不会大于质因子 2 的个数;ans = 0while n:n = n // 5ans += nreturn ans

4. x 的平方根 (扩展了解 快速平方根算法)

题目链接:x 的平方根 - leetcode
题目描述:
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5
题目归纳:
既然考察的是数学,那就请出牛顿提出的牛顿迭代法。这里可以拓展了解下 快速平方根倒数算法,还有那句著名的 what the xxxx?

解题思路:
解法: x 的平方根 - leetcode官方题解

class Solution:def mySqrt(self, x: int) -> int:# 牛顿迭代法if x == 0: return 0C, x0 = float(x), float(x)while True:xi = 0.5*(x0 + C/x0)if abs(x0 - xi) < 1e-7: # 两次求解的结果差距小于指定误差,可以返回return int(x0)x0 = xireturn int(x0)
参考文章或视频资料
【什么代码让程序员之神感叹“卧槽”?改变游戏行业的平方根倒数算法】- bilibili
【没那么神秘的快速平方根倒数,给你解释一下这个数是怎么来的】- bilibili

5. Pow(x,n)

题目链接:Pow(x,n) - leetcode
题目描述:
实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。
题目归纳:
(1)常规思路。 x n = x ⋅ x ⋅ x ⋅ x . . . ⋅ x x^n = x · x · x · x \space\space ... \space\space· x xn=xxxx  ...  x,这样方便理解,但计算并不快速。
(2)快速幂运算思路。其实快速幂运算就像微信小程序里的召唤神龙游戏,回忆下,召唤神龙是3只蝌蚪合成1只青蛙3只青蛙合成1条鲤鱼 … … ,实际中你几乎不会真的拿9只蝌蚪来合成鲤鱼,而是遇到和自己一样大的动物就拉入自己的队伍,朝着更大型的动物合成迈进,这样的方式合并次数是最少的,直到 … … 召唤神龙。数学术语的描述具体可以看leetcode官方题解。

解题思路:
解法: Pow(x,n) - leetcode官方题解

class Solution:# 快速幂运算def quickMul(self, x: float, n: int) -> float:ans = 1.0while n > 0:if n & 1 == 1: # 末尾为1ans *= xx = x*x # x = x**2 反而会有问题n = n >> 1return ansdef myPow(self, x: float, n: int) -> float:if n >= 0:return self.quickMul(x, n)else:return 1.0 / self.quickMul(x, -n)

6. 直线上最多的点数

题目链接:直线上最多的点数 - leetcode
题目描述:
给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。
题目归纳:
n n n个点,可以画出 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1)条直线,如果再把每个点代入看是否符合该直线的方程,那时间复杂度将达到 O ( n 3 ) O(n^3) O(n3),这种算法绝对不可能被采用。
这里我插句题外话,这个算法只在平面上适用,比如说在《几何原本》中被奉为绝对真理的“两点确定一条直线”,在教科书上的表述并不是“两点只能确定一条直线”,因为在非欧几何中这个假设就不成立,若考虑地球是完美球体,那么地球的南极点到北极点有无数条经线,对于地球上的蚂蚁而言,这些经线毫无疑问就是其所处平面的直线,我们人类对宇宙的探索又何尝不是火鸡呢,谁知道两点之间有多少的连接可能性被空间本身的结构抛弃了。只做个人意见,如有错误请指正。
如果向量数据库采用的仍旧是占据主流的平面几何的学说,这是否符合大多数实际情况呢?会不会有些情况是需要用到非欧几何的呢?

解题思路:
解法: 直线上最多的点数 - leetcode官方题解

# 给一个数组points,其中,points[i] = [x_i, y_i]# 求,最多有多少个点在同一条直线上# 这道题对 向量数据库 应该非常重要,是向量数据库的基础算法,比如求向量之间的相似度与距离或者聚类# 可以考虑枚举所有point,假设直线经过该point时,该直线所能经过的最多的点数# 假设当前枚举到point{i},若直线同时经过另外两个不同的点j、k,那么(i,j)所在直线的斜率 = (i,k)所在直线的斜率# 于是,我们可以统计其它所有点与point{i}所连直线的斜率,出现次数最多的斜率,即为经过点数最多的斜率,其经过点数为 该斜率出现的次数+1(+1指point{i}自身)# 不采用浮点数记录斜率,因为精度可能不够,换用元组记录斜率的(分子,分母)的形式,这种记录形式可能有以下问题需要解决# (A) 两个元组:(1,2), (2,4)的斜率一致,所以还涉及到约分,即GCD最大公约数的求解# (B) 分子分母存在负数,(-1,2), (1,-2)的斜率一致,因此规定分母为非负整数,如果分母为负数,将二元组的两个数同时取反# (C) 直线为y=C或x=C时,传统的斜截式无法表达,采用特判法。# 再加以下4个小优化# (1)点的数量<=2,用一条直线将所有点串联,直接返回点的数量# (2)枚举到点i时,只考虑编号 >=i的点 与 点i之间的斜率,例如,编号小于点i的点j,当枚举到j自己的时候,就已经计算过点j与点i的斜率,即两点之间经过一条直线,不重复计算两次# (3)当找到的一条直线,已经经过了图中超过半数的点时,直接确定该直线为经过最多点的直线,然后继续按照该直线求点数# (4)当枚举到点i(编号从0开始)时,最多只能找到n-i个点共线,因为按优化(2),只考虑比自己编号大的。假设此前找到的共线的点数量最大值为k,如果有k>=n-i,此时即可停止枚举,因为不可能再找到更大的答案了。class Solution:def gcd(self, a, b): # 迭代法求最大公约数while b != 0:remain = a % b # 余数a = bb = remainreturn adef maxPoints(self, points: List[List[int]]) -> int:n = len(points)if n <= 2: # 优化(1)return nret = 0for i in range(n):if ret >= n-i or ret > (n/2): # 优化(4)与优化(3)breakmp = Counter()for j in range(i+1, n): # 优化(2),只考虑比自己编号大的点delta_x = points[i][0] - points[j][0] # △xdelta_y = points[i][1] - points[j][1] # △y# 对记录形式的优化(C)。特例判断if delta_x == 0:delta_y = 1elif delta_y == 0:delta_x = 1else:if delta_y < 0: # 对记录形式的优化(B)delta_x = -delta_xdelta_y = -delta_ygcdXY = self.gcd(abs(delta_x), abs(delta_y))delta_x = delta_x / gcdXYdelta_y = delta_y / gcdXYmp[str(delta_y + delta_x*20001)] += 1 # 看官方题解maxn = 0for k,v in mp.items():maxn = max(maxn, v+1)ret = max(ret, maxn)return ret

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

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

相关文章

什么是泛型约束?

泛型约束是一种在泛型类型参数上定义约束条件的机制&#xff0c;它可以帮助我们限制泛型类型参数的取值范围。 在 TypeScript 中&#xff0c;可以使用 extends 关键字来定义泛型类型参数的约束条件。例如&#xff0c;我们可以定义一个泛型函数&#xff0c;要求它的类型参数必须…

ubuntu系统(9):ubuntu 20.02安装pydot

目录 警告信息 1、确保安装了Python和pip 2、安装Graphviz软件包 3、pip安装pydot 验证 在gem5中&#xff0c;pydot库用于生成图形化输出&#xff0c;特别是生成.dot文件和相关的图像文件&#xff0c;如PDF、PNG等。它与gem5结合使用的一个常见用途是生成系统结构图、内存…

基础篇_面向对象(什么是对象,对象演化,继承,多态,封装,接口,Service,核心类库,异常处理)

文章目录 一. 什么是对象1. 抽取属性2. 字段默认值3. this4. 无参构造5. 抽取行为 二. 对象演化1. 对象字段演化2. 对象方法演化3. 贷款计算器 - 对象改造4. 静态变量5. 四种变量 三. 继承1. 继承语法2. 贷款计算器 - 继承改造3. java 类型系统4. 类型转换1) 基本类型转换2) 包…

【QT学习十】QListView

目录 一、QListView 概述 二、QListView 的主要特性包括&#xff1a; 三、基本用法 1、创建及基本属性设置 2、添加显示的值 3、获取ListView中的内容 4、列表模式和图标模式之间切换 5、自定义 四、提高性能 五、总结 一、QListView 概述 QListView 是一个用于显示列…

【算法分析与设计】最大子数组和

题目 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&a…

讯飞智文利用人工智能技术帮助用户快速生成Word和PPT文档

网址 https://zhiwen.xfyun.cn/ 讯飞智文是一个由科大讯飞股份有限公司提供的在线服务&#xff0c;它利用人工智能技术帮助用户快速生成Word文档和PPT演示文稿。这个平台的特点包括&#xff1a; 一键生成文档&#xff1a;用户可以通过输入一句话主题或长文本&#xff0c;快速…

硬核加码!星邦蓝助力全球运力最大固体火箭“引力一号”海上首飞

继助力我国最大固体运载火箭“力箭一号”首飞后&#xff0c;星邦蓝再次有幸参与和见证了全球运力最大的固体火箭“引力一号”首次成功发射。 今日&#xff0c;全球运力最大的固体火箭“引力一号”从山东海阳附近海域完成首次发射&#xff0c;刷新世界最大固体运载火箭纪录&…

2024年抖音小店,三大运营趋势,新手商家注意了!

大家好&#xff0c;我是电商糖果 每年都有大量的商家入驻抖音小店&#xff0c;小店的运营趋势每年也都会有变化。 2024年抖音小店依旧是平台重点扶持的项目&#xff0c;所以&#xff0c;今年依旧有大量的商家想要入驻。 这篇文章糖果就给大家总结了2024年&#xff0c;抖音小…

关于鸿蒙的ArkUI的自我理解

先不说好不好上手 一些软件必要的基础概念了解 ①瓦片地图 --无或未找到 ②视频播放功能 --未找到能播放直播流&#xff08;找到个 ohos/ijkplayer不知如何&#xff09; ③支付功能 微信无 支付宝的是java代码写得&#xff0c;AskUI中如何调用 ④推送 --自己应该有吧 ⑤长…

【一周安全资讯0106】国家标准《信息安全技术 网络安全信息报送指南》正式发布;全球1100万SSH服务器面临“水龟攻击”威胁

要闻速览 1、国家标准GB/T 43557-2023《信息安全技术 网络安全信息报送指南》发布 2、《未成年人网络保护条例》元旦起施行 织密未成年人网络保护立体“安全网” 3、深圳证监局&#xff1a;证券期货经营机构应建立健全网络安全应急处置机制 4、黑客大规模恶意注册与ChatGPT相似…

CKS考试心得

考前须知&#xff1a; 1、一共16题&#xff0c;100分66分及格&#xff0c;考试有两次机会 考试准备&#xff1a; 1、护照或或者包含英文名字证件 2、要选择工作日的早上或者晚上考试&#xff0c;千万不要选择周末去考&#xff0c;否则卡到怀疑人生&#xff0c;影响考试结果…

全面解析微服务

导读 微服务是企业应用及数据变革升级的利器&#xff0c;也是数字化转型及运营不可或缺的助产工具&#xff0c;企业云原生更离不开微服务&#xff0c;同时云原生的既要最大化发挥微服务的价值&#xff0c;也要最大化弥补微服务的缺陷。本文梳理了微服务基础设施组件、服务网格、…

C++重新认知:拷贝构造函数

一、什么是拷贝构造函数 对于简单变量来说&#xff0c;可以轻松完成拷贝。 int a 10; int b a;但是对于复杂的类对象来说&#xff0c;不仅存在变量成员&#xff0c;也存在各种函数等。因此相同类型的类对象是通过拷贝构造函数来完成复制过程的。 #include<iostream>…

基于 TensorFlow.js 构建垃圾评论检测系统

基于 TensorFlow.js 构建垃圾评论检测系统。 准备工作 在过去的十年中,Web 应用变得越来越具有社交性和互动性,而即使是在中等热门的网站上,也有数万人可能实时对多媒体、评论等的支持。这也让垃圾内容发布者有机会滥用此类系统,将不太令人满意的内容与其他人撰写的文章、视…

小程序必看系列!什么是抖音小程序?抖音小程序怎么制作?

随着移动互联网的飞速发展&#xff0c;抖音已经成为了一个广受欢迎的短视频平台。在这个平台上&#xff0c;用户可以分享自己的生活点滴、表达自己的观点&#xff0c;甚至还能通过小程序来丰富自己的社交体验。那么&#xff0c;如何制作抖音小程序呢&#xff1f; 一、抖音小程…

5288 SDH/PDH数字传输分析仪

5288 SDH/PDH数字传输分析仪 数字通信测量仪器 5288 SDH/PDH数字传输分析仪为高性能手持式数字传输分析仪&#xff0c;符合ITU-T SDH/PDH技术规范和我国光同步传输网技术体制的规定,支持2.048、34.368、139.264Mb/s及155.520Mb/s传输速率的测试。可进行SDH/PDH传输设备和网络的…

云畅科技技术中心被认定为湖南省省级企业技术中心

近日&#xff0c;湖南省工业和信息化厅公布《2023年第二批湖南省省级企业技术中心(第29批)》&#xff0c;云畅科技技术中心作为研发设计型代表入选。 省级企业技术中心是强化企业技术创新主体地位&#xff0c;增强企业自主创新能力&#xff0c;推动工业企业高质量发展的一个重要…

Vue-插槽(Slots)

1. 介绍 在Vue.js中&#xff0c;插槽是一种强大的功能&#xff0c;它允许你创建可重用的模板&#xff0c;并在使用该模板的多个地方插入自定义内容。 插槽为你提供了一种方式&#xff0c;可以在父组件中定义一些“插槽”&#xff0c;然后在子组件中使用这些插槽&#xff0c;插…

SQL-分组查询

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

turnjs实现翻书效果

需求&#xff1a;要做一个效果&#xff0c;类似于阅读器上的翻书效果。 咱们要实现这个需求就需要使用turnjs这个插件&#xff0c;他的官网是turnjs官网。 进入官网后可以点击 这个按钮去下载官网的demo。 这个插件依赖于jQuery&#xff0c;所以你的先安装jQuery. npm insta…