0
点赞
收藏
分享

微信扫一扫

1005. 继续(3n+1)猜想(Python)


背景

  • 在使用​​Pyhton​​​ 解决​​[PAT].1005​​ 过程中,由于细节处理不当导致测试点0、1、4全部错误,最终仅得到5分!
  • 细节决定成败!

题目描述

  • 问题具体描述可以参考图 1-1,也可以​​点击这里​​查看原址。
  • 1005. 继续(3n+1)猜想(Python)_继续-3n+1-猜想

解决思路 [NEW]

  • 返回计算中间值函数
  • 在 待验证的正整数
  • 格式化转换、排序、输出
  • 注意,将字符串类型的剩余正整数集合进行排序得到的结果是不正确的(数值排序)。

提交结果(5分)

'''
1 返回覆盖集合
'''
def get_cover(nums):
tmp=[]
while True: # 失误,处理公式不正确
if nums==1:
break
nums=nums//2 if nums%2==0 else (nums*3+1)//2
tmp.append(nums)
return set(tmp)

nums=int(input()) # 2 读入数据
while nums: # 3 遍历计算覆盖值取差集
num_strs=input().split(' ')
result=set([int(num) for num in num_strs])
for num in num_strs:
covers=get_cover(int(num))
result=result.difference(covers)
nums-=1

result=[str(val) for val in result]
result.sort(reverse=True)
print (' '.join(result))

提交结果(25分)

def get_cover(nums): # 1 返回覆盖集合
tmp=[]
while True: # 失误,处理公式不正确
if nums==1:
tmp.append(1)
break
nums=nums//2 if nums%2==0 else (nums*3+1)//2
tmp.append(nums)
return set(tmp)

nums=int(input()) # 2 读入数据
while nums: # 3 遍历计算覆盖值取差集
num_strs=input().split(' ')
result=set([int(num) for num in num_strs])
for num in num_strs:
covers=get_cover(int(num))
result=result.difference(covers)
nums-=1

result=list(result)
result.sort(reverse=True)
result=[str(val) for val in result]
print (' '.join(result))

结果分析

  • 很明显,对比前后提交的代码也就只有最后4
  • 另外,一开始面对提交结果时,自己也比较困惑问题出在了哪里,搜索了一些答案,差不多都是小巫见大巫吧,几乎没有清晰、透彻的分析。

排查问题

  • 其实也不用多说,方法大家都(mai)知(guan)道(zi)。
  • 提交前
  • 多次测试!
  • 多次测试!
  • 多次测试!

e.g.

# 造测试案例
import random

for i in range(0,5):
ns=random.randint(1,30)
print (ns,' '.join([str(random.randint(1,100)) for i in range(0,ns)]))

# 测试数据集
22 57 35 99 26 20 11 35 61 70 30 5 88 41 78 78 3 36 38 88 81 83 71
30 28 25 49 86 97 70 43 62 18 48 88 29 59 21 34 10 7 83 55 34 57 56 93 63 9 84 54 50 5 35
4 81 27 4 67
16 100 52 60 41 75 83 45 76 92 22 31 41 70 42 48 27
12 98 25 30 3 46 14 33 96 15 40 36 29

  • 未提交前,可以使用合适数量的测试案例验证运行结果,然后再提交。
  • 提交后,可以参考别人正确的代码,进行运行结果对比,应该就能很快找到原因。

最终结果:

得分

用时(ms)

内存(kb)

25

24

3184


举报

相关推荐

0 条评论