凉山州住房与城乡建设局网站,网址交易网站,爱给网素材官网,上海手机网站建设报价一个认为一切根源都是“自己不够强”的INTJ
个人主页#xff1a;用哲学编程-CSDN博客专栏#xff1a;每日一题——举一反三Python编程学习Python内置函数
Python-3.12.0文档解读
目录
初次尝试 再次尝试
代码点评
代码结构
时间复杂度
空间复杂度
优化建议
我要更强… 一个认为一切根源都是“自己不够强”的INTJ
个人主页用哲学编程-CSDN博客专栏每日一题——举一反三Python编程学习Python内置函数
Python-3.12.0文档解读
目录
初次尝试 再次尝试
代码点评
代码结构
时间复杂度
空间复杂度
优化建议
我要更强
优化建议
完整代码及注释
时间复杂度和空间复杂度分析
进一步优化
哲学和编程思想
模块化设计
抽象化
效率优化
迭代和递归
预先计算和缓存
错误处理和异常管理
数据驱动设计
简洁性
举一反三 题目链接https://pintia.cn/problem-sets/994805260223102976/exam/problems/type/7?problemSetProblemId994805276438282240page0
初次尝试
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)代码点评
这段代码实现了两个字符串的加密处理其中每个字符串代表一个数字序列。加密规则如下
对于奇数位从右往左数将两个字符串对应位置的数字相加结果模13然后转换为特定的字符10-J, 11-Q, 12-K或保持为数字。对于偶数位计算第二个字符串对应位置的数字减去第一个字符串对应位置的数字如果结果为负则加10。
代码结构
使用sys.stdin.readline()读取输入这通常用于处理标准输入适用于命令行交互。通过strip()和split()方法处理输入确保输入格式正确。使用循环从后往前遍历字符串处理每个位置的加密逻辑。输出结果前通过字符串拼接构建最终的加密结果。
时间复杂度
时间复杂度为O(n)其中n是两个输入字符串的最大长度。这是因为代码中有一个循环循环次数等于最大字符串长度。
空间复杂度
空间复杂度也是O(n)主要用于存储输入字符串和输出字符串。输入字符串的长度决定了所需的额外空间。
优化建议
考虑输入的边界情况例如输入为空字符串或非数字字符的情况。可以优化字符串拼接的方式使用str.join()方法代替操作以提高效率。对于输入的错误处理可以更加健壮例如添加异常处理机制。
总体来说这段代码逻辑清晰时间复杂度和空间复杂度都是线性的适用于处理中等长度的字符串加密。 我要更强
优化建议
字符串拼接优化使用str.join()代替操作因为操作在每次执行时都会创建新的字符串对象而join()方法预先计算所需空间效率更高。输入处理优化可以预先检查输入的有效性确保输入的是数字字符串。循环内部优化减少不必要的类型转换和条件判断。
完整代码及注释 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()方法转换为字符串。
进一步优化
可以考虑使用更高效的输入输出方法例如使用文件或更快的输入输出库。对于大量数据处理可以考虑使用更高效的算法或数据结构例如使用数组代替字符串处理。
这段代码已经相对高效适用于处理中等长度的字符串加密任务。 哲学和编程思想
在上述代码优化中涉及到的哲学和编程思想主要包括 模块化设计 代码被分解为多个小部分每个部分负责一个特定的任务如输入处理、加密计算、输出构建。这种模块化的设计使得代码更易于理解和维护同时也便于测试和调试。 抽象化 通过将具体的加密逻辑抽象为对每个位置的处理代码避免了直接处理复杂的加密规则使得逻辑更加清晰和易于管理。 效率优化 使用str.join()代替操作来优化字符串拼接这是基于对Python字符串操作的深入理解。字符串在Python中是不可变的每次使用操作都会创建一个新的字符串对象而join()方法则预先计算所需空间减少了内存分配和复制操作。 迭代和递归 代码使用迭代循环来处理字符串的每个位置而不是递归。迭代通常比递归更高效因为它避免了函数调用的开销和潜在的栈溢出问题。 预先计算和缓存 在循环中预先计算可能的边界条件如字符串长度不足时的默认值减少了每次迭代中的条件判断。这种预先计算可以减少运行时的计算量提高效率。 错误处理和异常管理 虽然代码中没有显式的异常处理但通过预先检查输入的有效性可以避免潜在的运行时错误。这种预防性的编程思想有助于构建更健壮的系统。 数据驱动设计 代码的逻辑主要围绕数据字符串的每个位置进行通过处理数据来驱动加密逻辑的执行。这种设计使得代码更加灵活易于适应不同的数据输入。 简洁性
代码力求简洁明了避免不必要的复杂性和冗余。简洁的代码不仅易于阅读和理解也减少了出错的可能性。
这些编程思想和哲学不仅适用于上述代码的优化也是软件工程和编程实践中广泛应用的原则。通过这些思想的应用可以提高代码的质量、可维护性和效率。 举一反三
基于上述哲学和编程思想以下是一些技巧和建议可以帮助你在编程中举一反三提高代码质量和效率
模块化与单一职责原则 确保每个函数或模块只做一件事并且做好这件事。这有助于提高代码的可读性和可维护性。使用函数或类来封装相关的功能使得代码结构清晰易于理解和修改。抽象化与接口设计 设计抽象的接口或基类隐藏具体实现细节使得代码更加灵活和可扩展。使用抽象数据类型如列表、字典来表示复杂的数据结构而不是直接操作底层数据。效率优化与性能分析 使用性能分析工具如Python的cProfile来识别代码中的瓶颈。优化循环和递归避免不必要的计算和内存分配。使用合适的数据结构和算法例如使用集合set来快速查找元素使用字典dict来存储键值对。迭代与递归的合理选择 对于深度不大的问题可以考虑使用递归它可以使代码更简洁。对于深度不确定或可能很大的问题优先考虑迭代以避免栈溢出。预先计算与缓存 对于重复的计算使用缓存如字典或数组来存储中间结果避免重复计算。在循环中预先计算边界条件减少每次迭代中的条件判断。错误处理与异常管理 使用异常处理来优雅地处理错误而不是通过返回错误码。在代码中适当位置添加断言assert以确保程序状态的正确性。数据驱动设计与测试驱动开发TDD 编写测试用例来驱动代码的开发确保每个功能都按预期工作。使用数据驱动的方法来设计测试用例覆盖尽可能多的边界情况和异常情况。简洁性与可读性
编写简洁、清晰的代码避免过度复杂的逻辑和嵌套。使用有意义的变量名和函数名编写详细的注释帮助他人理解代码的意图。
通过应用这些技巧可以在编程中更加高效和有条理同时也能够提高代码的质量和可维护性。记住编程不仅仅是实现功能更是一种艺术和科学的结合需要不断地学习和实践。