一个认为一切根源都是“自己不够强”的INTJ
个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数
目录
我的写法:
![](https://img-blog.csdnimg.cn/direct/d23962b044e94198b54137a453b5d6c7.png)
#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)
代码点评:
这段代码简洁明了,很好地实现了题目要求的功能。下面是对这段代码的点评,包括时间复杂度和空间复杂度的分析:
代码点评:
- 输入处理:代码首先通过 int(input()) 读取用户输入,这是一个标准的Python输入方法,适用于命令行交互。
- 逻辑清晰:代码通过整数除法和取余操作来分离出百位、十位和个位数字,这是处理数字位数的基本方法。
- 格式化输出:对于百位和十位,代码使用了字符串乘法来生成相应数量的"B"和"S"。对于个位,使用了列表推导式生成从1到个位数字的连续数字,并通过 join 方法拼接成字符串。
- 错误处理:代码没有显式的错误处理,但由于题目已经明确输入是一个小于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)
代码优化说明:
- 条件表达式:在处理百位和十位时,使用了条件表达式(三元运算符)来避免不必要的字符串拼接,如果百位或十位为0,则不添加"B"或"S"。
- 空字符串处理:在处理个位时,同样使用了条件表达式来避免在个位为0时不必要的字符串拼接。
这些改动主要是为了提高代码的可读性和简洁性,并没有改变算法的时间复杂度和空间复杂度。由于这些操作都是常数时间的,因此整体的时间复杂度仍然是O(1)。空间复杂度也是O(1),因为除了输出字符串外,没有使用额外的数据结构,且输出字符串的最大长度是固定的。
哲学和编程思想
这段代码体现了几个重要的哲学和编程思想:
- KISS原则(Keep It Simple, Stupid):代码简洁明了,没有不必要的复杂性。每个部分都直接对应到问题的需求,使得代码易于理解和维护。
- DRY原则(Don't Repeat Yourself):代码中避免了重复的逻辑。例如,处理百位、十位和个位的逻辑非常相似,通过提取公共模式,减少了代码的重复。
- 模块化:代码将问题分解为几个小问题(处理百位、十位和个位),每个小问题都有清晰的解决方案。这种模块化的方法使得代码结构清晰,易于管理和扩展。
- 抽象:通过使用字符串乘法和列表推导式,代码抽象了生成特定格式字符串的细节,使得代码更加简洁和易于理解。
- 函数式编程思想:代码中使用了列表推导式来生成个位数字的字符串,这是一种函数式编程的特性,它强调使用表达式而不是语句来处理数据。
- 效率意识:代码在设计时就考虑了时间和空间效率,确保了时间复杂度和空间复杂度都是最优的。
- 用户交互:代码通过 input() 函数与用户进行交互,这是现代编程中常见的做法,体现了以用户为中心的设计思想。
- 错误预防:虽然代码没有显式的错误处理,但由于题目已经明确输入是一个小于1000的正整数,因此这种简化是合理的。这体现了在设计时预防错误而不是事后处理错误的思想。
举一反三:
- KISS原则(Keep It Simple, Stupid):
- 在设计解决方案时,始终追求最简单的方法。避免过度设计,不要引入不必要的复杂性。
- 使用简单、直观的代码结构。如果一个函数或方法变得太长或太复杂,考虑将其分解为更小的部分。
- DRY原则(Don't Repeat Yourself):
- 识别并抽象出代码中的重复模式。将这些模式封装成函数或类,以便在需要时重用。
- 使用模板方法或策略模式来处理可变的行为,这样可以避免在多个地方重复相同的逻辑。
- 模块化:
- 将大问题分解为小问题,然后分别解决。每个模块应该有单一的责任,并且可以独立测试。
- 使用接口或抽象类来定义模块之间的交互,这样可以提高模块的独立性和可替换性。
- 抽象:
- 使用高级数据结构和算法来简化问题的解决方案。例如,使用集合来处理数据去重,使用排序算法来处理有序数据。
- 通过封装复杂的逻辑在函数或类中,使得外部调用者不需要了解内部实现细节。
- 函数式编程思想:
- 使用高阶函数和lambda表达式来处理数据,这样可以减少临时变量的使用,使代码更加紧凑。
- 利用函数式编程库(如Python的itertools或JavaScript的lodash)来处理集合数据,提高代码的可读性和效率。
- 效率意识:
- 在编写代码时,始终考虑时间和空间的权衡。对于性能关键的部分,进行性能分析和优化。
- 使用合适的数据结构和算法来解决问题,确保在最坏情况下也能保持良好的性能。
- 用户交互:
- 设计用户友好的界面和交互流程。在编写命令行工具或GUI应用时,考虑用户的体验。
- 提供清晰的错误信息和帮助文档,帮助用户理解和解决问题。
- 错误预防:
- 在编码阶段就考虑可能出现的错误,并采取措施预防。例如,使用类型检查、输入验证和边界检查。
- 使用单元测试和集成测试来确保代码的正确性,及时发现和修复问题。
通过将这些原则和技巧应用到编程实践中,能够提高代码的质量,减少错误,提高开发效率,并能够更好地解决各种编程问题。
感谢阅读。