PythonTip(36~40)题详解

题目36:最大非连续子序列

描述:给你一个整数list L, 如 L=[2,-3,3,50], 求L的一个非连续子序列,使其和最大,输出最大子序列的和。
这里非连续子序列的定义是,子序列中任意相邻的两个数在原序列里都不相邻。
例如,对于L=[2,-3,3,50], 输出52(分析:很明显,该列表最大非连续子序列为[2,50]).

答案:与上题一样,用线性时间做

L = [0, 0] + L
n = len(L)
dp = [0] * n
for i in xrange(2, n):
    dp[i] = max(dp[i-2]+L[i], dp[i-1])
print dp[n-1]

题目37:简单题之勾股定理

描述:给你直角三角形的两个直角边的边长a,b,请你求出其斜边边长,结果保留小数点后三位小数。
如a=3, b =4, 则输出5.000。

答案:这个比较好做

import math
x = math.sqrt(a**2 + b**2)
print "%.3f"%(x)

题目38:简单题之列表转换

描述:给你一个字符串列表L,请用一行代码将列表所有元素拼接成一个字符串并输出。
如L=[‘abc’,’d’,’efg’], 则输出abcdefg。

答案:

print "".join(list(L))

题目39:简单题之输出格式练习

描述:给你一个字符串列表L,用一行代码顺序输出L中的元素,元素之间以一个空格隔开,注意行尾不要有空格,输出单独占一行。
如L=[‘abc’,’d’,’efg’], 则输出abc d efg。

答案:没什么好分析的,与上题类似。

print " ".join(L)

题目40:整数解

描述:给你两个整数a和b,请你判断是否存在两个整数,他们的和为a,乘积为b。 10000<a,b<10000
若存在,输出Yes,否则输出No
例如:a=9,b=15, 此时不存在两个整数满足上述条件,所以应该输出No。

答案:此题就是一元二次求根,求根公式。

from math import sqrt
# 判断是否有整数解
def HaveIntAns(a,b):
    gs = a*a-4*b
    # 是否有根
    if gs<0:
        return False

    # 整数根
    x = (a+sqrt(gs))/2
    y = (a-sqrt(gs))/2

    if x-int(x) != 0:
        return False
    if y-int(y) != 0:
        return False

    return True

if HaveIntAns(a, b):
    print "Yes"
else:
    print "No"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值