Python挑战100题(21~26)

21、山峰的个数

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

h=[0.9,1.2,1.22,1.1,1.6,0.99]
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)

22、三角形形状

题目:给以一个三角形的三边长a,b和c(边长是浮点数),请你判断三角形的形状。
若是锐角三角形,输出R,
若是直角三角形,输出Z,
若是钝角三角形,输出D,
若三边长不能构成三角形,输出W.
提示:
1..若其中有两边相等,则为[等腰三角形]
2.若其中有三边相等,则为[等边三角形]
3.若a的平方+b的平方=c平方,则为[直角三角形]
4.若a的平方+b的平方>c平方,则为[锐角三角形]
5.若a的平方+b的平方<c平方,则为[钝角三角形]
参考答案:

a,b,c = [4,3,5]
a,b,c = sorted([a,b,c])
if a+b>c and c-a<b:
    ab = a*a + b*b
    cc = c*c
    if ab>cc:
        print('R')
    elif ab<cc:
        print('D')
    else:
        print('Z')
else:
    print('W')

23、大幂次运算

题目:给你两个正整数a(0 < a < 100000)和n(0 <= n <=100000000000),计算(a^n) % 20132013并输出结果
提示:
pow(x,y,z) 函数是计算x的y次方,如果z在存在,则再对结果进行取模,其结果等效于pow(x,y) %z
参考答案:

print(pow(a,n,20132013))

更深入:来源http://www.pythontip.com/coding/report_detail/632/

先贴出AC代码如下:

def powAndMod(a,n,mod):

    res = 1
    while n > 0:
        if n%2 == 1:
            res = res * a % mod
        a = a * a % mod
        n >>= 1
    return res
print powAndMod(a,n,20132013)

代码在前面几个ACer的解题报告里面有一模一样的,我自己也是研究了好一阵子才知道代码的含义。讲解针对于小白,牛人就不用看了。

之前我写了如下代码,先求得a的n次幂,然后对20132013取模。求次幂是用的递归。

------------------
def pow(a,n):
    if n == 0:
        return 1
    else:
        return a*pow(a,n-1)
print pow(a,n)%20132013

提交的结果是超时,要求优化算法,因为a和n的数值很大的时候,递归的次数超过了规定的递归深度。因此只有寻找更好的算法。

算法思想:对于任意a和n求a的n次幂,an可以转化为a(p+q),其中p+q=n,因此我们只要把an转化为几个适当的p,q,满足aq * a^p * ....a^x = an,这样可以大大简化算法的复杂度。我们可以先把十进制数n化为二进制数xxxxxxxx(2),如100可以化为1100100(2),拆分为幂的和为:2、32、64,然后分别算22,232,264的数值,把它们相乘即可得到2^100。

24、最大连续子序列

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

L=[-2 ,6, -8, 5, 4, -7, 2, 6]
i = 0
sum = L[0]
for x in L:
    i += x
    if i > sum:
        sum = i
    elif i < 0:
        i = 0
print(sum)

25、最大非连续子序列

题目:给你一个整数list L, 如 L=[2,-3,3,50], 求L的一个非连续子序列,使其和最大,输出最大子序列的和。
这里非连续子序列的定义是,子序列中任意相邻的两个数在原序列里都不相邻。
例如,对于L=[2,-3,3,50], 输出52(分析:很明显,该列表最大非连续子序列为[2,50]).
参考答案:
动态规划:https://blog.csdn.net/Herishwater/article/details/94546608

L=[2,-3,3,50,-4,1]
n = len(L)
f = list(L)
for i in range(n):
    if i > 0:
        f[i] = max(f[i],f[i-1])
    if i > 1:
        f[i] = max(f[i],f[i-2]+L[i])
print(f[n-1])

**另一个:
**

# 看不懂的解决方案
for i in range(2,len(L)):
    L[i]=max(L[i-2]+L[i],L[i],L[i-2],0)
    L[i-1]=max(L[i-2],L[i-1],0)
print(max(L))

再一个:

L=[2,-3,3,50,-4,1]
b=[0 for i in range(len(L))]
for i in range(len(L)):
    if i==0 or i==1:
        b[0] = L[0]
        b[1] = L[1]
    else:
        b[i] = max(max(b[0:i-1])+L[i],L[i])
print(max(b))

26、Py数

题目:Py从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992,
这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,
同时它的十二进制数表示1894,其四位数字之和也为22,啊哈,真是巧啊。
Py非常喜欢这种四位数,由于他的发现,所以这里我们命名其为Py数。
现在给你一个十进制4位数n,你来判断n是不是Py数,若是,则输出Yes,否则输出No。
如n=2992,则输出Yes; n = 9999,则输出No。
知识补充:

image.png

十六进制的加法:
加减法的进/借位规则为:借一当十六,逢十六进一。

例如:3F+4A,写成竖式,先算F+A,F是十进制中的15,A是十,加起来是二十五,在十六进制中,满十六进一,二十五在十六进制中就是19,所以个位是9,进1,3+4+1=8,最后等于十六进制89。
相关函数:hex() 函数用于将10进制整数转换成16进制,以字符串形式表示。
十二进制:十进制到十二进制的转换可按下面的例子进行:
123456 ÷ 12 = 10288 ... 0 10288 ÷ 12 = 857 ... 4 857 ÷ 12 = 71 ... 5 71 ÷ 12 = 5 ... 11 (B) 5 ÷ 12 = 0 ... 5
将最右排的数从下往上依次写下,即得到123456 = (5B540)12 。

参考答案:

def py(a):
    sum1 = 0
    sum2 = 0
    e = list(str(a))
    for i in range(len(e)):
        sum1 += int(e[i])
    b = hex(a)                 # 换成16进制
    for j in range(2,len(b)):  # 16进制前两位0x表示16进制
        sum2 += int(b[j],16)   # int('39',16)将16进制的数39换算成10进制的数
    L = []
    while a>0:                 # 换成12进制数的集合
        L.append(a % 12)
        a //= 12
    f = sum(L)
    if sum1 == sum2 == f:
        print('Yes')
    else:
        print('No')

a = int(input('请输入需要判断的数a:'))
py(a)

参考二:

a = 0
tmp = n
while tmp:
    a += tmp % 12
    tmp //= 12

b = 0
tmp = n
while tmp:
    b += tmp % 10
    tmp //= 10

c = 0
tmp = n
while tmp:
    c += tmp % 16
    tmp //= 16

if a == b and b == c:
    print("Yes")
else:
    print("No")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342