Python每日一练(20230225)

news2024/11/18 20:46:15

目录

1. 整数反转

2. 求最大公约数和最小公倍数

最大公约数

最小公倍数

3. 单词搜索 II

附录:

DFS 深度优先搜索算法

BFS 广度优先搜索算法

BFS 和 DFS 的区别


1. 整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−2^31,  2^31 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

示例 4:

输入:x = 0
输出:0

提示:

  • -2^31 <= x <= 2^31 - 1

代码:

import math
class Solution:
    def reverse(self, x: int) -> int:
        r = 0
        y = 0
        abs_x = abs(x)
        negative = x < 0
        while abs_x != 0:
            r = abs_x % 10
            y = y*10+r
            abs_x = int(math.floor(abs_x/10))
        if negative:
            y = -y
        return 0 if (y > 2147483647 or y < -2147483648) else y

s = Solution()
nums = [123, -123, 120, 0, 1234567809]

for x in nums:
    print(s.reverse(x))

 优化后的代码:

class Solution:
    def reverse(self, x: int) -> int:
        num, neg = 0, x<0
        if neg: x *= -1
        while x:
            num = num*10 + x%10
            x //= 10
        res = -num if neg else num
        return res if -2**31<=res<2**31 else 0

s = Solution()
nums = [123, -123, 120, 0, 1234567809]

for x in nums:
    print(s.reverse(x))

 代码2: python 数和字串的转换非常方便,负数考虑负号。

class Solution(object):
    def reverse(self, x:int)->int:
        res = (-1 if x<0 else 1)*int(str(abs(x))[::-1])
        return res if -2**31<=res<2**31 else 0

s = Solution()
nums = [123, -123, 120, 0, 1234567809]

for x in nums:
    print(s.reverse(x))

代码3: 负号还可以用 x//abs(x) 来求,但要排队div by 0。

class Solution(object):
    def reverse(self, x:int)->int:
        res = abs(x)//x*int(str(abs(x))[::-1]) if x else 0
        return res if -2**31<=res<2**31 else 0

s = Solution()
nums = [123, -123, 120, 0, 1234567809]

for x in nums:
    print(s.reverse(x))

2. 求最大公约数和最小公倍数

输入两个数x 和y,如果x 或y 小于等于0,提示请输入正整数,求这两个数的最大公约数和最小公倍数。
注意:可以采用欧几里得辗转相除算法来求最大公约数。最小公倍数的计算方法是两数的乘积除以两数最大公约数的结果。

x = int(input("输入x:"))
y = int(input("输入y:"))
if x <= 0 or y <= 0:
    print("请输入正整数")
if x < y:
    x,y = y,x
v1 = x*y
v2 = x%y
while v2 != 0:
    x = y
    y = v2
    v2 = x % y
v1 =v1 // y
print("最大公约数为:%d" % y)  
print("最小公倍数为:%d" % v1) 

最大公约数

 方法一:for循环

def GCD(m, n):
    gcd = 1 # 此行可以省略
    for i in range(1,min(m, n)+1):
        if m%i==0 and n%i==0:
            gcd = i
    return gcd
        
print(GCD(81,3))

print(GCD(81,15))

print(GCD(81,54))

方法二:while循环

def GCD(m, n):
    while m!=n:
        if m>n: m -= n
        else: n -= m
    return m
        
print(GCD(81,3))

print(GCD(81,15))

print(GCD(81,54))

 方法三:递归法

def GCD(m, n):
    if n==0: return m
    return GCD(n, m%n)
        
print(GCD(81,3))

print(GCD(81,15))

print(GCD(81,54))

方法四:辗转相除法

def GCD(m, n):
    while n!=0:
        m, n = n, m%n
    return m
        
print(GCD(81,3))

print(GCD(81,15))

print(GCD(81,54))

方法五:递减法

def GCD(m, n):
    gcd = min(m, n)
    while m%gcd or n%gcd:
        gcd -= 1
    return gcd
        
print(GCD(81,3))

print(GCD(81,15))

print(GCD(81,54))

方法六:库函数math.gcd

from math import gcd
        
print(gcd(81,3))

print(gcd(81,15))

print(gcd(81,54))

或者:直接用 __import__('math').gcd

__import__('math').gcd(81,3)
__import__('math').gcd(81,15)
__import__('math').gcd(81,54)

方法七:约分法,库函数fractions.Fraction()

def GCD(m, n):
    from fractions import Fraction
    return m//Fraction(m, n).numerator #取分子
    #return n//Fraction(m, n).denominator #或取分母
        
print(GCD(81,3))

print(GCD(81,15))

print(GCD(81,54))

最小公倍数

方法一:循环暴力法

def LCM(m, n):
    for i in range(max(m,n),m*n+1):
        if i%m==0 and i%n==0:
            return i
        
print(LCM(81,3))

print(LCM(81,15))

print(LCM(81,54))

方法二:与最大公约数的关系

最小公倍数LCM 与 最大公约数GCD的关系: m * n = LCM(m, n) * GCD(m, n)

对应最大公约数的几种方法,返回 m*n 整除 GCD(m,n) 即可。

3. 单词搜索 II

给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。

单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。

示例 1:

输入:board = [["o","a","a","n"],["e","t","a","e"],["i","h","k","r"],["i","f","l","v"]], words = ["oath","pea","eat","rain"]
输出:["eat","oath"]

示例 2:

输入:board = [["a","b"],["c","d"]], words = ["abcb"]
输出:[]

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 12
  • board[i][j] 是一个小写英文字母
  • 1 <= words.length <= 3 * 104
  • 1 <= words[i].length <= 10
  • words[i] 由小写英文字母组成
  • words 中的所有字符串互不相同
class Solution:
    def findWords(self, board: list, words: list) -> list:
        if not board or not board[0] or not words:
            return []
        self.root = {}
        for word in words:
            node = self.root
            for char in word:
                if char not in node:
                    node[char] = {}
                node = node[char]
            node["#"] = word
        res = []
        for i in range(len(board)):
            for j in range(len(board[0])):
                tmp_state = []
                self.dfs(i, j, board, tmp_state, self.root, res)
        return res
    def dfs(self, i, j, board, tmp_state, node, res):
        if "#" in node and node["#"] not in res:
            res.append(node["#"])
        if [i, j] not in tmp_state and board[i][j] in node:
            tmp = tmp_state + [[i, j]]
            candidate = []
            if i - 1 >= 0:
                candidate.append([i - 1, j])
            if i + 1 < len(board):
                candidate.append([i + 1, j])
            if j - 1 >= 0:
                candidate.append([i, j - 1])
            if j + 1 < len(board[0]):
                candidate.append([i, j + 1])
            node = node[board[i][j]]
            if "#" in node and node["#"] not in res:
                res.append(node["#"])
            for item in candidate:
                self.dfs(item[0], item[1], board, tmp, node, res)


if __name__ == '__main__':

    s = Solution()
    board = [["o","a","a","n"],["e","t","a","e"],["i","h","k","r"],["i","f","l","v"]]
    words = ["oath","pea","eat","rain"]
    print(s.findWords(board, words))

    board = [["a","b"],["c","d"]]
    words = ["abcb"]
    print(s.findWords(board, words))

输出:

['oath', 'eat']
[]


附录:

DFS 深度优先搜索算法

Depth-First-Search,是一种用于遍历或搜索树或图的算法。这个算法会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

BFS 广度优先搜索算法

Breadth-First Search,又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。

BFS 和 DFS 的区别

1 数据结构
bfs 遍历节点是先进先出,一般使用队列作为辅助数据结构
dfs遍历节点是先进后出,一般使用栈作为辅助数据结构

2 访问节点的方式
bfs是按层次访问的,先访问源点,再访问它的所有相邻节点,并且标记结点已访问,根据每个邻居结点的访问顺序,依次访问它们的邻居结点,并且标记节点已访问,重复这个过程,一直访问到目标节点或无未访问的节点为止。
dfs 是按照一个路径一直访问到底,当前节点没有未访问的邻居节点时,然后回溯到上一个节点,不断的尝试,直到访问到目标节点或所有节点都已访问。

3 应用
bfs 适用于求源点与目标节点距离近的情况,例如:求最短路径。
dfs 更适合于求解一个任意符合方案中的一个或者遍历所有情况,例如:全排列、拓扑排序、求到达某一点的任意一条路径。

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

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

相关文章

大型旋转设备滑动轴承X、Y测点振动值说明(转载的)

滑动轴承支撑的大型旋转设备&#xff0c;绝大部分的故障都表现为不平衡引起的1倍频振动&#xff0c;诊断故障原因要根据振动随转速、负荷、温度、时间的变化情况来具体判断。滑动轴承设备的诊断主要依据电涡流传感器测量轴和轴瓦间的相对振动&#xff0c;判断转子相关的各种问题…

基于SpringBoot的共享汽车管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…

Orin安装ssh、vnc教程

文章目录一&#xff1a;ssh远程终端的配置PC的配置MobaXterm的下载二&#xff1a;VNC Viewer远程图形界面终端配置&#xff1a;PC配置&#xff1a;一&#xff1a;ssh远程 终端的配置 1.ifconfig查看终端ip地址 其中的eth是网口&#xff0c;我们需要看的是wlan0下的inet&#…

5M1270ZT144A5N CPLD 980MC 6.2NS 144TQFP /5M1270ZT144C5N

【产品介绍】MAX V系列低成本和低功耗CPLD提供更大的密度和每占地面积的I/O。MAX V器件的密度从40到2210个逻辑元件(32到1700个等效宏单元)和多达271个I/O&#xff0c;为I/O扩展、总线和协议桥接、电源监控和控制、FPGA配置和模拟IC接口等应用提供可编程解决方案。MAX V器件具有…

MYSQL 索引失效的十个场景(二)

六、对索引列运算&#xff08;如&#xff0c;、-、*、/、%等&#xff09;&#xff0c;索引失效 CREATE TABLE student (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,score decimal(10,2) DEFAULT NULL,subject varchar(…

【华为OD机试模拟题】用 C++ 实现 - 绘图机器(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【Leedcode】环形链表必备的面试题和证明题(附图解)

环形链表必备的面试题和证明题&#xff08;附图解&#xff09; 文章目录环形链表必备的面试题和证明题&#xff08;附图解&#xff09;前言一、第一题1.题目2.思路3.代码4.延伸问题(1)证明题一&#xff1a;(2)证明题二&#xff1a;二、第二题1.题目2.思路延伸的证明题总结前言 …

【网络原理8】HTTP请求篇

在上一篇文章当中&#xff0c;我们也提到了什么是HTTP。 每一个HTTP请求&#xff0c;都会对应一个HTTP响应。 下面这一篇文章&#xff0c;将聊一下HTTP请求的一些内容 目录 一、URL 第一部分&#xff1a;协议名称 第二部分:认证信息(新的版本已经没有了) 第三部分&#xf…

这款 Python 调试神器推荐收藏

大家好&#xff0c;对于每个程序开发者来说&#xff0c;调试几乎是必备技能。 代码写到一半卡住了&#xff0c;不知道这个函数执行完的返回结果是怎样的&#xff1f;调试一下看看 代码运行到一半报错了&#xff0c;什么情况&#xff1f;怎么跟预期的不一样&#xff1f;调试一…

【教学类-10-03】python单线程下载哔哩哔哩网址(中间字母不同,前面后面相同)的视频

背景需求&#xff1a;最近测试以前的多线程&#xff08;同时下载5个视频&#xff09;&#xff0c;结果30个视频只下到了3个&#xff0c;于是把“单个下载&#xff08;单线程下载&#xff09;”的一个代码进行拓展研究。前一篇介绍了网址尾数递增的遍历程序&#xff0c;本篇介绍…

【华为OD机试模拟题】用 C++ 实现 - 最大报酬(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

数据结构与算法之[把数字翻译成字符串]动态规划

前言&#xff1a;最近在刷动态规划的算法题目&#xff0c;感觉这一类题目还是有一点难度的&#xff0c;但是不放弃也还是能学好的&#xff0c;今天给大家分享的是牛客网中的编程题目[把数字翻译成字符串]&#xff0c;这是一道经典的面试题目&#xff0c;快手&#xff0c;字节跳…

CleanMyMac是什么清理软件?及使用教程

你知道CleanMyMac是什么吗&#xff1f;它的字面意思为“清理我的Mac”&#xff0c;作为软件&#xff0c;那就是一款Mac清理工具&#xff0c;Mac OS X 系统下知名系统清理软件&#xff0c;是数以万计的Mac用户的选择。它可以流畅地与系统性能相结合&#xff0c;只需简单的步骤就…

【机器学习 | 强基计划】开山篇 | 机器学习介绍及其类别和概念阐述

🤵‍♂️ 个人主页: @计算机魔术师 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。 机器学习 | 强基计划系列 (一) 作者: 计算机魔术师 版本: 1.0 ( 2022.2.25) 注释:文章会不定时更新补充 文章目录 前言一、机器学习概览1.1 有监督学习和无监督学习1.1.…

Day20【元宇宙的实践构想06】—— 元宇宙与Web3.0

&#x1f483;&#x1f3fc; 本人简介&#xff1a;男 &#x1f476;&#x1f3fc; 年龄&#xff1a;18 &#x1f91e; 作者&#xff1a;那就叫我亮亮叭 &#x1f4d5; 专栏&#xff1a;元宇宙 部分资料参考文献: 成生辉教授的《元宇宙&#xff1a;概念、技术及生态》和百度相关…

【数通网络交换基础梳理1】二层交换机、以太网帧、MAC地址数据帧转发原理详解

一、网络模型 万年不变&#xff0c;先从模型结构分析&#xff0c;现在大家熟知的网络模型有两种。第一种是&#xff0c;OSI七层模型&#xff0c;第二种是TCP/IP模型。在实际运用中&#xff0c;参考更多的是TCP/IP模型。 OSI七层模型 TCP/IP模型 不需要全部理解&#xff0c;…

电子技术——输出阶类型

电子技术——输出阶类型 输出阶作为放大器的最后一阶&#xff0c;其必须有较低的阻抗来保证较小的增益损失。作为放大器的最后一阶&#xff0c;输出阶需要处理大信号类型&#xff0c;因此小信号估计模型不适用于输出阶。尽管如此&#xff0c;输出阶的线性也非常重要。实际上&a…

绝对让你明明白白,脚把脚带你盯着 I2C 时序图将 I2C 程序给扣出来(基于STM32的模拟I2C)

目录前言一、关于STM32 I/O端口位的基本结构讲解二、模拟I2C编写前的需知道的知识1、I2C简介2、根据时序编写模拟I2C程序重要的两点Ⅰ、主机发送数据给从机时的时序控制Ⅱ、主机接收来自从机的数据时的时序控制Ⅲ、完整的I2C时序图&#xff08;按写程序的思想分割时序&#xff…

【华为OD机试模拟题】用 C++ 实现 - 不含 101 的数(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

跟着《代码随想录》刷题(三)——哈希表

3.1 哈希表理论基础 哈希表理论基础 3.2 有效的字母异位词 242.有效的字母异位词 C bool isAnagram(char * s, char * t){int array[26] {0};int i 0;while (s[i]) {// 并不需要记住字符的ASCII码&#xff0c;只需要求出一个相对数值就可以了array[s[i] - a];i;}i 0;whi…