PAT (Basic Level) Practice 1010 一元多项式求导 Python解法

一、题目

设计函数求一元多项式的导数。(注:x^n(n为整数)的一阶导数为nx ^n−1 。)

二、输入输出

输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。

三、样例

输入样例:
3 4 -5 2 6 1 -2 0
结尾无空行

输出样例:
12 3 -10 1 6 0
结尾无空行

四、题目分析

这道题目原理很简单,但要写出最高效率的代码需要深入思考。
其次这里面有个大坑,是仅仅使用Python语言才会遇到的。
1.思路:只需要借助flag标记保证结尾无空行的同时还能过滤输出,无需中间数组存储,直接输出,空间占用少,时间效率高。(详见代码1)。
2.大坑提醒:Python 中的split()函数用法回顾:

描述
split() 通过指定分隔符对字符串进行切片,如果第二个参数 num 有指定值,则分割为 num+1 个子字符串。

语法
split() 方法语法:

str.split(str="", num=string.count(str))
参数
str – 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num – 分割次数。默认为 -1, 即分隔所有。
返回值
返回分割后的字符串列表。
wa原因:由于Python并不具有像C++那种可以借助循环来输入不确定个数的整数,因此只能一股脑读入然后依靠分隔符函数split()分隔并存储在列表中,问题在于split(’ ‘)和split()的区别是,前者只能对空格分割,后者对包括空格、换行(\n)、制表符(\t)等进行分割。
然而题目中坑人的一点在于:
在这里插入图片描述
说好的以空格分隔,实际上如果使用split(’ ‘)再提交会显示两个测试点非零返回,如图:
在这里插入图片描述
非零返回意思就是说程序运行过程出错而异常退出,说明存在逻辑错误导致程序中断。
其实把split(’ ')里的引号去掉就能AC了。猜测可能是系统的测试点中有换行符,当数据量庞大时,存储在系统数据库的测试数据以文件形式存储,测试时也是连带换行符一起读去了的,因此需要用split()而非split(’ ')。
这也给我们提了个醒,千万不要以为PTA是个OJ系统就一定得对做题的人负责,我们作为程序设计人员也要思考PTA测试的本质,包括数据量、数据格式、题目出发点等等角度,这样综合起来考虑才更能跳出桎梏,走得更远。

五、Python代码

1.代码1(改编自柳婼,简洁巧妙):

get = input()
get = [int(i) for i in get.split()]
flag = 0
for i in range(0, len(get), 2):
    a = get[i]
    b = get[i + 1]
    if (b!=0):
        if (flag == 1):
            print(' ', end='')
        print(str(a * b)+' ' + str(b -1), end='')
        flag = 1
if (flag == 0):
    print('0 0', end='')

2.代码2(典型Python解题思路):

s = input().strip('\n').split()
print(s)
res = []
for i in range(0,len(s),2):
    if(int(s[i + 1]) == 0):
        continue
    m = int(s[i]) * int(s[i + 1])
    n = (int(s[i + 1])) - 1
    res.append(str(m))
    res.append(str(n))
if(len(res) == 0):
    print('0 0')
else:
    print(' '.join(res).strip())

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值