鱼C论坛

 找回密码
 立即注册
查看: 89|回复: 4

[已解决]每日一问?

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. num=[]
  2. def words(I,V,X,L,C,D,M):
  3.     roman
  4.     _input=input('请输入一个罗马字符:').upper()
  5.    
  6.     for i in _input:
  7.         num.append(i)

  8.     if len(num)>=2:
  9.         if num[0]=='I':
  10.             if num[1] in ['V','X']:
  11.                 answer=roman_to_value(num[1])-I
  12.             elif num[1] in ['L','C']:
  13.                 answer=roman_to_value(num[1])-X
  14.             elif num[1] in ['D','M']:
  15.                 answer=roman_to_value(num[1])-C
  16.             else:
  17.                 answer=roman_to_value(num[0])+roman_to_value(num[1])#感觉这串很多余,是否可以删掉?
  18.         else:
  19.             answer=roman_to_value(num[0])+roman_to_value(num[1])
  20.     elif len(num)==1:
  21.         answer=roman_to_value(num[0])
  22.     else:
  23.         answer=0

  24.     print('转换后的结果是:',answer)
  25.     return answer

  26. def roman_to_value(char,roman_dict=None):#这下面一串就是AI改的了,感觉太复杂了,能不能改简单点?而且关键是我没看懂
  27.     if roman_dict is None:
  28.         roman_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
  29.     return roman_dict.get(char,0)

  30. words(I=1,V=5,X=10,L=50,C=100,D=500,M=1000)
复制代码
#这里不用对roman_to_value进行补充了吗?

#还有一个灵魂拷问:如果自己打出与小甲鱼给出答案不同的代码,那还要不要花时间去研究答案呢?
最佳答案
3 天前
[quote]
罗马数字转换代码问题分析

主要问题:
  • num= 未初始化为列表(应改为 num=[])
  • if num=='I' 判断对象错误(num是列表,应该判断单个字符)
  • roman_to_value() 多次错误传递列表参数(应该传单个字符)
  • 复杂的if-elif结构无法处理罗马数字减法规则(如IV=4,IX=9等)


优化后代码:

  1. def roman_to_int(s):
  2.     roman = {'I':1, 'V':5, 'X':10, 'L':50,
  3.              'C':100, 'D':500, 'M':1000}
  4.     total = 0
  5.     prev_value = 0
  6.    
  7.     for char in reversed(s.upper()):
  8.         value = roman.get(char, 0)
  9.         if value < prev_value:
  10.             total -= value
  11.         else:
  12.             total += value
  13.         prev_value = value
  14.    
  15.     return total

  16. print(roman_to_int('MCMXCIV'))  # 测试输出1994
复制代码


代码特点:
  • 逆向遍历字符串,简化减法规则判断
  • 使用字典直接查询字符值
  • 时间复杂度O(n),空间复杂度O(1)


关于灵魂拷问的回答:
  • 先自己测试代码的正确性(用各种边界值测试)
  • 对比不同实现的时间复杂度可读性
  • 重点理解算法核心思想(如这里的减法规则实现方式)
  • 不同解法可能各有优劣,关键是掌握问题本质


小技巧:罗马数字转换核心规律是"当前字符值小于右边字符值时需要做减法",逆向遍历可以避免复杂的边界判断。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层    本楼为最佳答案   
[quote]
罗马数字转换代码问题分析

主要问题:
  • num= 未初始化为列表(应改为 num=[])
  • if num=='I' 判断对象错误(num是列表,应该判断单个字符)
  • roman_to_value() 多次错误传递列表参数(应该传单个字符)
  • 复杂的if-elif结构无法处理罗马数字减法规则(如IV=4,IX=9等)


优化后代码:

  1. def roman_to_int(s):
  2.     roman = {'I':1, 'V':5, 'X':10, 'L':50,
  3.              'C':100, 'D':500, 'M':1000}
  4.     total = 0
  5.     prev_value = 0
  6.    
  7.     for char in reversed(s.upper()):
  8.         value = roman.get(char, 0)
  9.         if value < prev_value:
  10.             total -= value
  11.         else:
  12.             total += value
  13.         prev_value = value
  14.    
  15.     return total

  16. print(roman_to_int('MCMXCIV'))  # 测试输出1994
复制代码


代码特点:
  • 逆向遍历字符串,简化减法规则判断
  • 使用字典直接查询字符值
  • 时间复杂度O(n),空间复杂度O(1)


关于灵魂拷问的回答:
  • 先自己测试代码的正确性(用各种边界值测试)
  • 对比不同实现的时间复杂度可读性
  • 重点理解算法核心思想(如这里的减法规则实现方式)
  • 不同解法可能各有优劣,关键是掌握问题本质


小技巧:罗马数字转换核心规律是"当前字符值小于右边字符值时需要做减法",逆向遍历可以避免复杂的边界判断。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
FishC 发表于 2025-5-22 22:15
[quote]
罗马数字转换代码问题分析

优化固然是好,但你把我的思路改的面目全非,我都不认识了。那毫无成就感呀,所以能不能保留我的基本逻辑
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 09:08 | 显示全部楼层
第一点: answer=roman_to_value(num[0])+roman_to_value(num[1])这行代码是用来处理输入为II的情况,不能删;
第二点:
def roman_to_value(char,roman_dict=None):#这个函数是将 字符型 按照 roman_dict 映射转成 整型 ;
    if roman_dict is None://如果没有 自定义字典 比如roman_to_value(‘I’),则 roman_dict 默认为下面的值;
        roman_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
    return roman_dict.get(char,0)//返回转化后的值,如果 char 不在字典中 返回0;
你也可以自定义一个map,如map={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000},然后这样调用roman_to_value(‘I’,map);
第三:你这个处理不了长度为三及以上的罗马数字输入,如XXX,应该输出30但是你的输入是20。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 18:02 | 显示全部楼层
本帖最后由 爱吃菠萝包 于 2025-5-24 17:25 编辑
xiaoniugogogo 发表于 2025-5-23 09:08
第一点: answer=roman_to_value(num[0])+roman_to_value(num[1])这行代码是用来处理输入为II的情况,不能 ...


首先我问的是第17行,好像不是说输入为II的情况吧?还是我没理解
其次我没有看懂你的第二点哎
最后,那么大佬怎么改呀

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-25 20:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表