每日一题——Python实现PAT乙级1006 换个格式输出整数(举一反三+思想解读+逐步优化)


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

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

Python-3.12.0文档解读

目录

我的写法:​编辑

代码点评:

代码点评:

时间复杂度分析:

空间复杂度分析:

我要更强!

代码优化说明:

哲学和编程思想

举一反三:


题目链接


我的写法:

#include <stdio.h>

int 
main()
{
    int num,i;
    scanf("%d",&num);
    int handred_bit=num/100,ten_bit=(num/10)%10,single_bit=num%10;
    if(handred_bit!=0)
    {
        for(i=1;i<=handred_bit;i++)
            putchar('B');
    }
    if(ten_bit!=0)
    {
        for(i=1;i<=ten_bit;i++)
            putchar('S');
    }
    if(single_bit!=0)
    {
        for(i=1;i<=single_bit;i++)
            putchar('0'+i);
    }
}
# 读取输入
n = int(input())

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

# 处理百位
hundreds = n // 100
if hundreds > 0:
    output += "B" * hundreds
    n %= 100

# 处理十位
tens = n // 10
if tens > 0:
    output += "S" * tens
    n %= 10

# 处理个位
if n > 0:
    output += "".join(str(i) for i in range(1, n + 1))

# 输出结果
print(output)

代码点评:

这段代码简洁明了,很好地实现了题目要求的功能。下面是对这段代码的点评,包括时间复杂度和空间复杂度的分析:

代码点评:

  1. 输入处理:代码首先通过 int(input()) 读取用户输入,这是一个标准的Python输入方法,适用于命令行交互。
  2. 逻辑清晰:代码通过整数除法和取余操作来分离出百位、十位和个位数字,这是处理数字位数的基本方法。
  3. 格式化输出:对于百位和十位,代码使用了字符串乘法来生成相应数量的"B"和"S"。对于个位,使用了列表推导式生成从1到个位数字的连续数字,并通过 join 方法拼接成字符串。
  4. 错误处理:代码没有显式的错误处理,但由于题目已经明确输入是一个小于1000的正整数,因此这种简化是合理的。

时间复杂度分析:

  • 百位处理:时间复杂度为 O(1),因为整数除法和取余操作都是常数时间。
  • 十位处理:同样时间复杂度为 O(1)。
  • 个位处理:这里的时间复杂度取决于个位数字 n,因为需要生成从1到 n 的数字。在最坏情况下,n 为9,因此时间复杂度为 O(9),即 O(1)。

综上,整个程序的时间复杂度为 O(1),即常数时间复杂度。这是因为无论输入的数字是多少,程序执行的操作数量都是固定的。

空间复杂度分析:

  • 输出字符串:空间复杂度主要取决于输出字符串的长度,最大长度为 "BBBBSSSSS123456789",即19个字符。
  • 临时变量:除了输出字符串外,代码中使用的临时变量(如 hundreds, tens, n)都是常数级别的,不会随着输入规模的增加而增加。

因此,整个程序的空间复杂度为 O(1),即常数空间复杂度。

总结来说,这段代码在时间和空间效率上都非常高效,适合处理题目中描述的输入规模。


我要更强!
 

这段代码已经非常高效,时间复杂度和空间复杂度均为O(1),这意味着无论输入的数字大小如何,代码执行的时间和使用的空间都是常数级别的。因此,从算法的角度来看,这段代码已经是最优的。

不过,可以对代码进行一些微调,使其更加简洁或者提高可读性。以下是优化后的代码:

# 读取输入
n = int(input())

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

# 处理百位
hundreds = n // 100
output += "B" * hundreds if hundreds > 0 else ""
n %= 100

# 处理十位
tens = n // 10
output += "S" * tens if tens > 0 else ""
n %= 10

# 处理个位
output += "".join(str(i) for i in range(1, n + 1)) if n > 0 else ""

# 输出结果
print(output)

代码优化说明:

  1. 条件表达式:在处理百位和十位时,使用了条件表达式(三元运算符)来避免不必要的字符串拼接,如果百位或十位为0,则不添加"B"或"S"。
  2. 空字符串处理:在处理个位时,同样使用了条件表达式来避免在个位为0时不必要的字符串拼接。

这些改动主要是为了提高代码的可读性和简洁性,并没有改变算法的时间复杂度和空间复杂度。由于这些操作都是常数时间的,因此整体的时间复杂度仍然是O(1)。空间复杂度也是O(1),因为除了输出字符串外,没有使用额外的数据结构,且输出字符串的最大长度是固定的。


哲学和编程思想

这段代码体现了几个重要的哲学和编程思想:

  1. KISS原则(Keep It Simple, Stupid):代码简洁明了,没有不必要的复杂性。每个部分都直接对应到问题的需求,使得代码易于理解和维护。
  2. DRY原则(Don't Repeat Yourself):代码中避免了重复的逻辑。例如,处理百位、十位和个位的逻辑非常相似,通过提取公共模式,减少了代码的重复。
  3. 模块化:代码将问题分解为几个小问题(处理百位、十位和个位),每个小问题都有清晰的解决方案。这种模块化的方法使得代码结构清晰,易于管理和扩展。
  4. 抽象:通过使用字符串乘法和列表推导式,代码抽象了生成特定格式字符串的细节,使得代码更加简洁和易于理解。
  5. 函数式编程思想:代码中使用了列表推导式来生成个位数字的字符串,这是一种函数式编程的特性,它强调使用表达式而不是语句来处理数据。
  6. 效率意识:代码在设计时就考虑了时间和空间效率,确保了时间复杂度和空间复杂度都是最优的。
  7. 用户交互:代码通过 input() 函数与用户进行交互,这是现代编程中常见的做法,体现了以用户为中心的设计思想。
  8. 错误预防:虽然代码没有显式的错误处理,但由于题目已经明确输入是一个小于1000的正整数,因此这种简化是合理的。这体现了在设计时预防错误而不是事后处理错误的思想。

举一反三:

  1. KISS原则(Keep It Simple, Stupid):
    • 在设计解决方案时,始终追求最简单的方法。避免过度设计,不要引入不必要的复杂性。
    • 使用简单、直观的代码结构。如果一个函数或方法变得太长或太复杂,考虑将其分解为更小的部分。
  2. DRY原则(Don't Repeat Yourself):
    • 识别并抽象出代码中的重复模式。将这些模式封装成函数或类,以便在需要时重用。
    • 使用模板方法或策略模式来处理可变的行为,这样可以避免在多个地方重复相同的逻辑。
  3. 模块化:
    • 将大问题分解为小问题,然后分别解决。每个模块应该有单一的责任,并且可以独立测试。
    • 使用接口或抽象类来定义模块之间的交互,这样可以提高模块的独立性和可替换性。
  4. 抽象:
    • 使用高级数据结构和算法来简化问题的解决方案。例如,使用集合来处理数据去重,使用排序算法来处理有序数据。
    • 通过封装复杂的逻辑在函数或类中,使得外部调用者不需要了解内部实现细节。
  5. 函数式编程思想:
    • 使用高阶函数和lambda表达式来处理数据,这样可以减少临时变量的使用,使代码更加紧凑。
    • 利用函数式编程库(如Python的itertools或JavaScript的lodash)来处理集合数据,提高代码的可读性和效率。
  6. 效率意识:
    • 在编写代码时,始终考虑时间和空间的权衡。对于性能关键的部分,进行性能分析和优化。
    • 使用合适的数据结构和算法来解决问题,确保在最坏情况下也能保持良好的性能。
  7. 用户交互:
    • 设计用户友好的界面和交互流程。在编写命令行工具或GUI应用时,考虑用户的体验。
    • 提供清晰的错误信息和帮助文档,帮助用户理解和解决问题。
  8. 错误预防:
  • 在编码阶段就考虑可能出现的错误,并采取措施预防。例如,使用类型检查、输入验证和边界检查。
  • 使用单元测试和集成测试来确保代码的正确性,及时发现和修复问题。

通过将这些原则和技巧应用到编程实践中,能够提高代码的质量,减少错误,提高开发效率,并能够更好地解决各种编程问题。


感谢阅读。

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

用哲学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值