Python Tip(31~35)题详解

题目31:山峰的个数

描述:十一假期,小P出去爬山,爬山的过程中每隔10米他都会记录当前点的海拔高度(以一个浮点数表示),
这些值序列保存在一个由浮点数组成的列表h中。回到家中,小P想研究一下自己经过了几个山峰,请你帮他计算一下,输出结果。
例如:h=[0.9,1.2,1.22,1.1,1.6,0.99], 将这些高度顺序连线,会发现有两个山峰,故输出一个2(序列两端不算山峰)

答案:

count = 0
for i in range(1,len(h)-1):
    if h[i]>h[i+1] and h[i]>h[i-1]:
        count += 1
print count

题目32:三角形形状

描述:给以一个三角形的三边长a,b和c(边长是浮点数),请你判断三角形的形状。
若是锐角三角形,输出R,
若是直角三角形,输出Z,
若是钝角三角形,输出D,
若三边长不能构成三角形,输出W.

答案:首先要知道知道三边,如何判断三角形形状的条件,即若 a2+b2=c2 直角三角形(勾股定理逆定理),若 a2+b2>c2 锐角三角形,若 a2+b2<c2 钝角三角形.

da = a*a
db = b*b
dc = c*c
dm = max([da,db,dc])
op = da+db+dc-dm
if ((a+b)>c) and ((a+c)>b) and ((b + c)>a):
    if dm==op:
        print 'Z'
    elif dm>op:
        print 'D'
    else:
        print 'R'
else:
    print 'W'

题目33:大幂次运算

描述:给你两个正整数a(0 < a < 100000)和n(0 <= n <=100000000000),计算 (an)%20132013 输出结果

答案:这是我的算法。

print pow(a,n,20132013)
举一反三

1.这算法比较复杂啊

# -*- coding: UTF-8 -*-
def quickmul(x, n, mod):
    ans = 1
    t = x
    while n:
        if n & 1:
            ans = (ans * t) % mod
        t = t * t % mod
        n >>= 1
    return ans
print(quickmul(a, n, 20132013))

2.别人的算法,看懂就行

# -*- coding: UTF-8 -*-
b = bin(n)[-1:1:-1]

m = a
r = a if b[0] == '1' else 1

for i in xrange(1,len(b)):
    m = m**2 % 20132013
    if b[i]=='1':
        r = r * m % 20132013

print r

题目34:密码生成

描述:生活在当代社会,我们要记住很多密码,银行卡,qq,人人,微博,邮箱等等。小P经过一番思索之后,发明了下面这种生成密码方法:
给定两个正整数a和b, 利用a / b我们会到的一个长度无限的小数(若a / b不是无限小数,
比如1/2=0.5,我们认为0.5是0.5000000…,同样将其看做无限长的小数),小P将该小数点后第x位到第y位的数字
当做密码,这样,无论密码有多长,小P只要记住a,b,x,y四个数字就可以了,牢记密码再也不是那么困难的事情了。
现在告诉你a,b,x,y(0 < a,b <= 20132013, 0 < x <= y < 100000000000),请你输出密码。
例如:a = 1, b = 2, x = 1, y = 4, 则 a / b = 0.5000000…, 输出小数点后第1到4位数字,即5000

答案:

题目35:最大连续子序列

描述:给你一个整数list L, 如 L=[2,-3,3,50], 求L的一个连续子序列,使其和最大,输出最大子序列的和。
例如,对于L=[2,-3,3,50], 输出53(分析:很明显,该列表最大连续子序列为[3,50]).

答案:

past, now, ret = 0, 0, 0
for x in L:
    now = now + x
    past = min(past, now)
    ret = max(ret, now-past)
print ret
举一反三

1.

# -*- coding: UTF-8 -*-
L=[2,-3,3,50]
a=[]
b=[]
for i in L:
    a.append(a[-1]+i if a else i)
    b.append(a[-1] - min(a) if min(a)< 0 else a[-1])

print max(b)

2.

# -*- coding: UTF-8 -*-
L=[2,-3,3,50]
maxx = L[0]
cur = 0

for i in range(0, len(L)):
    cur += L[i]
    if cur > maxx:
        maxx = cur
    if cur < 0:
        cur = 0
print(maxx)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值