每日一题——Python代码实现PAT乙级1048 数字加密(举一反三+思想解读+逐步优化)五千字好文

news2025/1/16 8:13:35


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

目录

初次尝试

 再次尝试

代码点评

代码结构

时间复杂度

空间复杂度

优化建议

我要更强

优化建议

完整代码及注释

时间复杂度和空间复杂度分析

进一步优化

哲学和编程思想

模块化设计:

抽象化:

效率优化:

迭代和递归:

预先计算和缓存:

错误处理和异常管理:

数据驱动设计:

简洁性:

举一反三


题目链接:https://pintia.cn/problem-sets/994805260223102976/exam/problems/type/7?problemSetProblemId=994805276438282240&page=0

初次尝试

import sys
input = sys.stdin.read
print = sys.stdout.write

def mod13(num):
    return "0123456789JQK"[num]

# 读取输入
A, B = input().strip().split()

len_A = len(A)
len_B = len(B)
output = ''

# 从后向前遍历字符
for i in range(1, min(len_A, len_B) + 1):
    if i % 2 == 1:  # 奇数位
        output = mod13((int(A[-i]) + int(B[-i])) % 13) + output
    else:  # 偶数位
        result = int(B[-i]) - int(A[-i])
        if result < 0:
            result += 10
        output = str(result) + output

# 如果B比A长,直接拼接剩余部分
if len_B > len_A:
    output = B[:len_B-len_A] + output

# 输出结果
print(output + '\n')

题目没说如果长度不同就用0补齐,但是得补齐

 再次尝试

import sys

# 读取输入
input_data = sys.stdin.readline().strip()
A, B = input_data.split()

# 初始化输出字符串
output = ''

# 从最低位开始处理,即从后往前遍历
len_A = len(A)
len_B = len(B)
max_len = max(len_A, len_B)

for i in range(1, max_len + 1):
    # 获取A和B的当前位数字
    a_digit = int(A[-i]) if i <= len_A else 0
    b_digit = int(B[-i]) if i <= len_B else 0
    
    # 根据奇偶位进行加密运算
    if i % 2 == 1:  # 奇数位
        result = (a_digit + b_digit) % 13
        if result == 10:
            output = 'J' + output
        elif result == 11:
            output = 'Q' + output
        elif result == 12:
            output = 'K' + output
        else:
            output = str(result) + output
    else:  # 偶数位
        diff = b_digit - a_digit
        if diff < 0:
            diff += 10
        output = str(diff) + output

# 输出加密后的结果
print(output)

代码点评

这段代码实现了两个字符串的加密处理,其中每个字符串代表一个数字序列。加密规则如下:

  1. 对于奇数位(从右往左数),将两个字符串对应位置的数字相加,结果模13,然后转换为特定的字符(10->'J', 11->'Q', 12->'K')或保持为数字。
  2. 对于偶数位,计算第二个字符串对应位置的数字减去第一个字符串对应位置的数字,如果结果为负,则加10。
代码结构
  • 使用sys.stdin.readline()读取输入,这通常用于处理标准输入,适用于命令行交互。
  • 通过strip()和split()方法处理输入,确保输入格式正确。
  • 使用循环从后往前遍历字符串,处理每个位置的加密逻辑。
  • 输出结果前,通过字符串拼接构建最终的加密结果。
时间复杂度
  • 时间复杂度为O(n),其中n是两个输入字符串的最大长度。这是因为代码中有一个循环,循环次数等于最大字符串长度。
空间复杂度
  • 空间复杂度也是O(n),主要用于存储输入字符串和输出字符串。输入字符串的长度决定了所需的额外空间。
优化建议
  • 考虑输入的边界情况,例如输入为空字符串或非数字字符的情况。
  • 可以优化字符串拼接的方式,使用str.join()方法代替+操作,以提高效率。
  • 对于输入的错误处理可以更加健壮,例如添加异常处理机制。

总体来说,这段代码逻辑清晰,时间复杂度和空间复杂度都是线性的,适用于处理中等长度的字符串加密。


我要更强

优化建议
  1. 字符串拼接优化:使用str.join()代替+操作,因为+操作在每次执行时都会创建新的字符串对象,而join()方法预先计算所需空间,效率更高。
  2. 输入处理优化:可以预先检查输入的有效性,确保输入的是数字字符串。
  3. 循环内部优化:减少不必要的类型转换和条件判断。
完整代码及注释

import sys

# 读取输入
input_data = sys.stdin.readline().strip()
A, B = input_data.split()

# 初始化输出字符串
output = []

# 从最低位开始处理,即从后往前遍历
len_A = len(A)
len_B = len(B)
max_len = max(len_A, len_B)

for i in range(1, max_len + 1):
    # 获取A和B的当前位数字
    a_digit = int(A[-i]) if i <= len_A else 0
    b_digit = int(B[-i]) if i <= len_B else 0
    
    # 根据奇偶位进行加密运算
    if i % 2 == 1:  # 奇数位
        result = (a_digit + b_digit) % 13
        if result == 10:
            output.append('J')
        elif result == 11:
            output.append('Q')
        elif result == 12:
            output.append('K')
        else:
            output.append(str(result))
    else:  # 偶数位
        diff = b_digit - a_digit
        if diff < 0:
            diff += 10
        output.append(str(diff))

# 输出加密后的结果
print(''.join(output[::-1]))
时间复杂度和空间复杂度分析
  • 时间复杂度:O(n),其中n是两个输入字符串的最大长度。循环遍历每个字符一次。
  • 空间复杂度:O(n),主要用于存储输出字符串。使用列表output存储中间结果,最后通过join()方法转换为字符串。
进一步优化
  • 可以考虑使用更高效的输入输出方法,例如使用文件或更快的输入输出库。
  • 对于大量数据处理,可以考虑使用更高效的算法或数据结构,例如使用数组代替字符串处理。

这段代码已经相对高效,适用于处理中等长度的字符串加密任务。


哲学和编程思想

在上述代码优化中,涉及到的哲学和编程思想主要包括:

  1. 模块化设计:

    • 代码被分解为多个小部分,每个部分负责一个特定的任务(如输入处理、加密计算、输出构建)。这种模块化的设计使得代码更易于理解和维护,同时也便于测试和调试。
  2. 抽象化:

    • 通过将具体的加密逻辑抽象为对每个位置的处理,代码避免了直接处理复杂的加密规则,使得逻辑更加清晰和易于管理。
  3. 效率优化:

    • 使用str.join()代替+操作来优化字符串拼接,这是基于对Python字符串操作的深入理解。字符串在Python中是不可变的,每次使用+操作都会创建一个新的字符串对象,而join()方法则预先计算所需空间,减少了内存分配和复制操作。
  4. 迭代和递归:

    • 代码使用迭代(循环)来处理字符串的每个位置,而不是递归。迭代通常比递归更高效,因为它避免了函数调用的开销和潜在的栈溢出问题。
  5. 预先计算和缓存:

    • 在循环中预先计算可能的边界条件(如字符串长度不足时的默认值),减少了每次迭代中的条件判断。这种预先计算可以减少运行时的计算量,提高效率。
  6. 错误处理和异常管理:

    • 虽然代码中没有显式的异常处理,但通过预先检查输入的有效性,可以避免潜在的运行时错误。这种预防性的编程思想有助于构建更健壮的系统。
  7. 数据驱动设计:

    • 代码的逻辑主要围绕数据(字符串的每个位置)进行,通过处理数据来驱动加密逻辑的执行。这种设计使得代码更加灵活,易于适应不同的数据输入。
  8. 简洁性:

  • 代码力求简洁明了,避免不必要的复杂性和冗余。简洁的代码不仅易于阅读和理解,也减少了出错的可能性。

这些编程思想和哲学不仅适用于上述代码的优化,也是软件工程和编程实践中广泛应用的原则。通过这些思想的应用,可以提高代码的质量、可维护性和效率。


举一反三

基于上述哲学和编程思想,以下是一些技巧和建议,可以帮助你在编程中举一反三,提高代码质量和效率:

  1. 模块化与单一职责原则:
    • 确保每个函数或模块只做一件事,并且做好这件事。这有助于提高代码的可读性和可维护性。
    • 使用函数或类来封装相关的功能,使得代码结构清晰,易于理解和修改。
  2. 抽象化与接口设计:
    • 设计抽象的接口或基类,隐藏具体实现细节,使得代码更加灵活和可扩展。
    • 使用抽象数据类型(如列表、字典)来表示复杂的数据结构,而不是直接操作底层数据。
  3. 效率优化与性能分析:
    • 使用性能分析工具(如Python的cProfile)来识别代码中的瓶颈。
    • 优化循环和递归,避免不必要的计算和内存分配。
    • 使用合适的数据结构和算法,例如使用集合(set)来快速查找元素,使用字典(dict)来存储键值对。
  4. 迭代与递归的合理选择:
    • 对于深度不大的问题,可以考虑使用递归,它可以使代码更简洁。
    • 对于深度不确定或可能很大的问题,优先考虑迭代,以避免栈溢出。
  5. 预先计算与缓存:
    • 对于重复的计算,使用缓存(如字典或数组)来存储中间结果,避免重复计算。
    • 在循环中预先计算边界条件,减少每次迭代中的条件判断。
  6. 错误处理与异常管理:
    • 使用异常处理来优雅地处理错误,而不是通过返回错误码。
    • 在代码中适当位置添加断言(assert),以确保程序状态的正确性。
  7. 数据驱动设计与测试驱动开发(TDD):
    • 编写测试用例来驱动代码的开发,确保每个功能都按预期工作。
    • 使用数据驱动的方法来设计测试用例,覆盖尽可能多的边界情况和异常情况。
  8. 简洁性与可读性:
  • 编写简洁、清晰的代码,避免过度复杂的逻辑和嵌套。
  • 使用有意义的变量名和函数名,编写详细的注释,帮助他人理解代码的意图。

通过应用这些技巧,可以在编程中更加高效和有条理,同时也能够提高代码的质量和可维护性。记住,编程不仅仅是实现功能,更是一种艺术和科学的结合,需要不断地学习和实践。


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

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

相关文章

【python】python海底捞门店营业数据分析与可视化(数据集+源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

自2008年金融危机以来首次,欧洲AAA级CMBS投资者面临亏损

在欧洲预期损失之前&#xff0c;美国AAA级CMBS投资者已经遭受了打击。即便是最高信用等级的投资也不再安全&#xff0c;全球金融系统可能存在一些严重的问题。 历史罕见&#xff0c;最安全的AAA级债权人&#xff0c;在没有发生经济危机的情况下&#xff0c;出现了损失&#xff…

Pwn刷题记录(不停更新)

1、CTFshow-pwn04&#xff08;基础canary&#xff09; ​ 好久没碰过pwn了&#xff0c;今天临时做一道吧&#xff0c;毕竟刚联合了WSL和VSCode&#xff0c;想着试着做一道题看看&#xff0c;结果随手一点&#xff0c;就是一个很少接触的&#xff0c;拿来刷刷&#xff1a; ​ …

ClickHouse备份方案

ClickHouse备份方案主要包括以下几种方法&#xff1a; 一、使用clickhouse-backup工具&#xff1a; &#xff08;参考地址&#xff1a;https://blog.csdn.net/qq_43510111/article/details/136570850&#xff09; **安装与配置&#xff1a;**首先从GitHub获取clickhouse-bac…

apksigner jarsigner.md

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、apksigner3.2 为 APK 签名3.3 验证…

【深海王国】小学生都能玩的单片机?零基础入门单片机Arduino带你打开嵌入式的大门!(8)

Hi٩(๑o๑)۶, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督继续为大家带来系列——小学生都能玩的单片机&#xff01;带你一周内快速走进嵌入式的大门&#xff0c;let’s go&#xff01; &#xff08;8&#x…

系统安全设计规范(Word原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 资料获取&#xff1a;私信或者进主页。…

PAT A1016. 最短路径

题意 有N个结点围成一个圈&#xff0c;相邻两个点之间的距离已知&#xff0c;且每次只能移动到相邻点。然后给出M个询问&#xff0c;每个询问给出两个数字A和B即结点编号(1≤A,B≤N)&#xff0c;求从A号结点到B号结点的最短距离。样例解释 如图3-2所示,共有5个结点&#xff0c;…

昇思25天学习打卡营第5天 | 网络构建

内容介绍&#xff1a;神经网络模型是由神经网络层和Tensor操作构成的&#xff0c;mindspore.nn提供了常见神经网络层的实现&#xff0c;在MindSpore中&#xff0c;Cell类是构建所有网络的基类&#xff0c;也是网络的基本单元。一个神经网络模型表示为一个Cell&#xff0c;它由不…

让你的Python代码更简洁:一篇文章带你了解Python列表推导式

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 列表推导式 📒📝 语法📝 条件筛选📝 多重循环📝 列表推导式的优点📝 使用场景📝 示例代码🎯 示例1🎯 示例2⚓️ 相关链接 ⚓️📖 介绍 📖 在Python编程中,列表推导式是一种强大且高效的语法,它允许你用…

2024-06-17 问AI: 在深度学习中,harmonic mean是什么?

文心一言 在深度学习中&#xff0c;**harmonic mean&#xff08;调和平均数&#xff09;**是一个用于评估模型性能的指标&#xff0c;特别是在处理不平衡的数据集或需要综合多个评估指标的场景中。以下是关于harmonic mean在深度学习中应用的详细解释&#xff1a; 定义&#…

6 PXE高效批量网络装机

6.1部署PXE远程安装服务 在大规模的Liunx应用环境中&#xff0c;如web群集&#xff0c;分布式计算等&#xff0c;服务器往往并不配备光驱设备&#xff0c;在这种情况下&#xff0c;如何为数十乃至上百台服务器裸机快速安装系统呢&#xff1f;传统的USB光驱&#xff0c;移动硬盘…

【数学】100332. 包含所有 1 的最小矩形面积 II

本文涉及知识点 数学 LeetCode100332. 包含所有 1 的最小矩形面积 II 给你一个二维 二进制 数组 grid。你需要找到 3 个 不重叠、面积 非零 、边在水平方向和竖直方向上的矩形&#xff0c;并且满足 grid 中所有的 1 都在这些矩形的内部。 返回这些矩形面积之和的 最小 可能值…

一个整数使用英文表达的字母计数

题目&#xff1a; 把1到5写成英文单词分别是&#xff1a;one、two、three、four、five。这些单词一共用了33544 19 个字母。 如果把1到1000都写成英文单词&#xff0c;一共要用多少个字母&#xff1f; 注&#xff1a;不计入空格和连字符&#xff0c;例如&#xff0c;342&am…

CentOS 7 内核 3.10 升级 6.5.2 (RPM 直装 + 源码编译)

方案一 直接基于 RPM 在线升级&#xff08;简单&#xff0c;速度快&#xff09; rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y # &#xff08;选项一&#xff09;升级最新版内…

linux系统cpu飙高如何排查

1.通过top命令查看cpu占比较高的进程ID 2.通过top -H -p <进程ID>命令查看该进程中具体线程&#xff0c;可以看到第一个线程 4311 占用了88.2%的cpu 3.通过 printf "%x\n" <线程ID> 把10进制的线程id转为16进制 4.通过jstack <进程ID> | grep &…

解决ArcGIS导出的svg格式的图片插入Word后的字体问题

背景 在ArcGIS中设置字体为Times New Roman&#xff0c;但导入Word后字体转为等线。 ArcGIS中的Layout 导入Word​​​​​​ 原因分析 Word无法识别嵌入进SVG格式文件中的字体。 解决方案 在Export Layer窗口中&#xff0c;将Embed fonts取消勾选&#xff0c;Convert cha…

【Python/Pytorch 】-- SVM算法

文章目录 文章目录 00 写在前面01 SVM算法简介02 SVM算法的基本原理线性SVM非线性SVM 03 基于Python 版本的SVM算法04 优化目标表达式理解&#xff1a;05 约束条件表达式理解 00 写在前面 SVM算法可以结合鲸鱼算法、飞蛾扑火算法、粒子群算法、灰狼算法、蝙蝠算法等等各种优化…

【Qt笔记①】帮助文档、窗口、按钮、信号和槽、lambda表达式

学习第一天&#xff1a;2024-3-9 文章目录 Qt creator 快捷键帮助文档默认生成的main.cpp逐行解释核心类帮助文档的查阅方法-①代码创建按钮第一个第二个对窗口的其他设置 对象树窗口坐标系信号和槽&#xff08;优点&#xff1a;松散耦合&#xff09;帮助文档的查阅方法-②找信…

【数据挖掘】机器学习中相似性度量方法-闵可夫斯基距离

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…