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


一个认为一切根源都是“自己不够强”的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.writedef 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) + outputelse:  # 偶数位result = int(B[-i]) - int(A[-i])if result < 0:result += 10output = 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 0b_digit = int(B[-i]) if i <= len_B else 0# 根据奇偶位进行加密运算if i % 2 == 1:  # 奇数位result = (a_digit + b_digit) % 13if result == 10:output = 'J' + outputelif result == 11:output = 'Q' + outputelif result == 12:output = 'K' + outputelse:output = str(result) + outputelse:  # 偶数位diff = b_digit - a_digitif diff < 0:diff += 10output = 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 0b_digit = int(B[-i]) if i <= len_B else 0# 根据奇偶位进行加密运算if i % 2 == 1:  # 奇数位result = (a_digit + b_digit) % 13if 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_digitif diff < 0:diff += 10output.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.mzph.cn/news/858199.shtml

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

相关文章

Nacos 2.x 系列【15】数据源插件支持达梦、Oracel、PostgreSQL......

文章目录 1. 概述2. 持久层机制2.1 固定语句2.2 数据源插件 3. 案例演示3.1 编译已实现插件3.2 自定义插件3.3 数据库初始化3.4 插件引入3.4.1 方式一&#xff1a;引入到源码3.4.2 方式二&#xff1a;插件加载目录 3.5 修改配置3.6 测试 1. 概述 在实际项目开发中&#xff0c;…

https://curl.trillworks.com不能用的解决方法

gitee源码:https://gitee.com/Project0ne/curlconverter 首先打开上面的链接 然后下载文件 下载文件到本地 然后安装node.js(Node.js official website.)不会的自行百度,这里不做过多赘述。 在curlconverter文件夹下面打开终端(在文件夹下面右键-在终端打开) 输入 npm…

图像反转入门

文章目录 1.实验目的2.需求3.代码4.运行结果图 1.实验目的 熟练掌握图像像素操作API 2.需求 自己构造一个纯黑图像,通过多种方法进行反转,最终生成一个纯白图像 3.代码 """ Time : 2024/6/23 下午3:46 Author : chensong File : 自己创建一个图像并…

Minillama3->dpo训练

GitHub - leeguandong/MiniLLaMA3: llama3的迷你版本,包括了数据,tokenizer,pt的全流程llama3的迷你版本,包括了数据,tokenizer,pt的全流程. Contribute to leeguandong/MiniLLaMA3 development by creating an account on GitHub.https://github.com/leeguandong/MiniLL…

[保姆级教程]uniapp自定义导航栏

文章目录 导文隐藏默认导航栏&#xff1a;全局隐藏当前页面隐藏 添加自定义导航栏视图&#xff1a;手写导航栏组件导航栏 导文 在 UniApp 中&#xff0c;自定义导航栏通常涉及到隐藏默认的导航栏&#xff0c;并在页面顶部添加自定义的视图组件来模拟导航栏的功能。 隐藏默认导航…

C++11 标准库头文件模拟实现

系列文章目录 文章目录 系列文章目录前言● 智能指针模板● Vector1. 简单版本2. X 总结 前言 暂不考虑支持多线程 常用STL的简单实现&#xff0c;主要内容百行左右完成&#xff0c;意在理解STL的原理 ● 智能指针模板 SharedPtr #include <assert.h> #include <ato…

主数据驱动的数据治理:技术解析与实践探索

数字化转型行业小伙伴可以加入我的星球&#xff0c;初衷成为各位数字化转型参考库&#xff0c;星球内容每周更新 个人工作经验资料全部放在这里&#xff0c;包含数据治理、数据要素、数据质量、数据安全、元数据、主数据、企业架构、DCMM、DSMM、CDGA、CDGP等各种数据相关材料 …

抖音多功能全自动引流工具,支持评论关注私信留痕点赞等,让你的抖音粉丝暴涨!

随着短视频行业的火爆&#xff0c;越来越多的人开始关注抖音这个平台。然而&#xff0c;如何在抖音上获得更多的关注和粉丝&#xff0c;成为了许多人面临的难题。为了帮助大家解决这个问题&#xff0c;今天我们将为大家推荐一款抖音多功能全自动引流脚本&#xff0c;这款脚本可…

HarmonyOS SDK助力鸿蒙原生应用“易感知、易理解、易操作”

6月21-23日&#xff0c;华为开发者大会&#xff08;HDC 2024&#xff09;盛大开幕。6月23日上午&#xff0c;《HarmonyOS开放能力&#xff0c;使能应用原生易用体验》分论坛成功举办&#xff0c;大会邀请了多位华为技术专家深度解读如何通过根技术、开放能力、场景化控件等亮点…

vue3 antdv Select 实现输入关键词,通过服务器去查询数据,并显示到表格中的实现思路。

实现思路&#xff1a; 1&#xff09;输入关键词&#xff0c;通过Select的查询事件&#xff08;onSearch&#xff09;来到服务器查询数据。 2&#xff09;根据查询到的数据显示到表格中&#xff0c;然后通过表格的&#xff08;cellClickEvent&#xff09;事件来选择相关的用户…

Python武器库开发-武器库篇之ThinkPHP 5.0.23-RCE 漏洞复现(六十四)

Python武器库开发-武器库篇之ThinkPHP 5.0.23-RCE 漏洞复现&#xff08;六十四&#xff09; 漏洞环境搭建 这里我们使用Kali虚拟机安装docker并搭建vulhub靶场来进行ThinkPHP漏洞环境的安装&#xff0c;我们进入 ThinkPHP漏洞环境&#xff0c;可以 cd ThinkPHP&#xff0c;然…

嵌入式学习——数据结构(队列)——day50

1. 查找二叉树、搜索二叉树、平衡二叉树 2. 哈希表——人的身份证——哈希函数 3. 哈希冲突、哈希矛盾 4. 哈希代码 4.1 创建哈希表 4.2 5. 算法设计 5.1 正确性 5.2 可读性&#xff08;高内聚、低耦合&#xff09; 5.3 健壮性 5.4 高效率&#xff08;时间复杂度&am…

【Java】pcm 与 wav 格式互转工具类 (附测试用例)

文章目录 1. 前言1.1 背景1.2 目标1.3 亮点 2. 用例说明3. 补充验证4. 相关链接 1. 前言 git 仓库 https://github.com/ChenghanY/pcm-wav-converter 1.1 背景 系统新接入语音引擎。 语音引擎只认 pcm 格式数据。前端只认 wav 格式 。 需要后端对 pcm 和 wav 格式实现互转&a…

2.超声波测距模块

1.简介 2.超声波的时序图 3.基于51单片机实现的代码 #include "reg52.h" #include "intrins.h" sbit led1P3^7;//小于10&#xff0c;led1亮&#xff0c;led2灭 sbit led2P3^6;//否则&#xff0c;led1灭&#xff0c;led2亮 sbit trigP1^5; sbit echo…

Adobe XD最新2023资源百度云盘下载(附教程)

如大家所了解的&#xff0c;Adobe XD是一种基于矢量的UI和UX设计工具&#xff0c;可用于设计从智能手表应用程序到成熟网站的任何内容&#xff0c;功能非常强大且操作便捷。目前最新已推出2023版本。 Adobe XD解决了Photoshop和其他图形应用程序无法解决的两个主要问题&#xf…

vue 中实现用户上传文件夹的功能

vue 中实现上传文件夹的功能 使用 input 元素的 webkitdirectory 属性使用 vue-simple-uploader 组件 vue 中文件上传一般都是用 element 中的 upload 组件&#xff0c;upload 组件可以实现单个文件或者多个文件的上传&#xff0c;但是无法通过选择文件夹上传其中文件。 要实现…

八爪鱼现金流-030,升级日志

八爪鱼现金流 八爪鱼 2024年4月4日09:27:02 v-0.0.1 资产包、负债包&#xff0c;功能优化 2024年4月15日09:27:26 v-0.0.2 增加公告模块 2024年4月18日12:14:32 v-0.0.3 市场查询优化。创建人脱敏处理。增加市场风云菜单。 2024年4月18日15:57:10 v-0.0.4 对于无截止日…

如何自制一个Spring Boot Starter并推送到远端公服

在现代Java开发中&#xff0c;Spring Boot无疑是一个强大且便捷的框架&#xff0c;它通过提供大量的Starter来简化依赖管理和项目配置。有时&#xff0c;我们可能需要为特定功能或团队定制Starter。本文将指导你如何创建自己的Spring Boot Starter并将其推送到远程公共服务器上…

Pwn刷题记录(不停更新)

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

ClosedXML

一、类库介绍 ClosedXML是一个用于读取、操作和写入Excel 2007 (.xlsx, .xlsm)文件的.NET第三方库。它基于OpenXML&#xff0c;但与OpenXML相比&#xff0c;ClosedXML具有更高的性能和更易于使用的API接口。 ClosedXML支持XML文档的解析和生成&#xff0c;可以处理复杂的XML结…