PythonTip 50道题目(部分题解)

来源:互联网 发布:课时优化八上英语答案 编辑:程序博客网 时间:2024/05/17 02:42


一马当先 

讨论此题 | 解题报告 
 (AC/Submit)Ratio(461|1769)26.06% 

描述:
下过象棋的人都知道,马只能走'日'字形(包括旋转90°的日),现在想象一下,给你一个n行m列网格棋盘,棋盘的左下角有一匹马,请你计算至少需要几步可以将它移动到棋盘的右上角,若无法走到,则输出-1.如n=1,m=2,则至少需要1步;若n=1,m=3,则输出-1。
解题思路:刷过不少ACM题,这样的题目自然一看就知道思路,重点在于学习用已经学过的C++转化成PYthon语言
用list二维列表保存棋盘,三维列表保存要到达的棋盘的坐标和所需要的步数。
列表的基本用法:点击打开链接
我的代码:(因为我的sublime text 3还没解决中文问题,导致不能用中文注释,正在解决ing )
m=6n=n+1m=m+1cnt = 1dir = [[-1,2],[1,2],[-2,1],[2,1],[-2,-1],[2,-1],[-1,-2],[1,-2]]map = [[0]*(m) for x in range(0,n)]flag =[[0]*(m) for x in range(0,n)]success = 0step = [[0,0,0]] flag[0][0] = 1while len(step)>0 and success==0:temp = step.pop()for i in range(0,8):ex = temp[0] + dir[i][0]ey = temp[1] + dir[i][1]if ex>=0 and ex<n and ey>=0 and ey<m and flag[ex][ey]==0:step.append([ex,ey,temp[2]+1])flag[ex][ey] = 1        if ex==n-1 and ey==m-1 :        success = 1        cnt = temp[2]+1if success == 1:print cntelse:print -1

                                 
                                                                                                          格式化时间 

讨论此题 | 解题报告 
 (AC/Submit)Ratio(734|1830)40.11% 

描述:
给你一个时间t(t是一个字典,共有六个字符串key(year,month,day,hour,minute,second),值为每个值为数字组成的字符串,如t={'year':'2013','month':'9','day':'30','hour':'16','minute':'45','second':'2'}请将其按照以下格式输出, 格式:XXXX-XX-XX XX:XX:XX。如上例应该输出: 2013-09-30 16:45:02。
我的代码:
res=t['year'].zfill(4)+'-'+t['month'].zfill(2)+'-'+t['day'].zfill(2)+' '+t['hour'].zfill(2)+':'+t['minute'].zfill(2)+':'+t['second'].zfill(2)print res
                                                             

序列判断 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(855|2432)35.16% 

描述:
给你一个整数组成的列表L,按照下列条件输出:若L是升序排列的,则输出"UP";若L是降序排列的,则输出"DOWN";若L无序,则输出"WRONG"。
解题思路:用切片保存原列表中内容,sort()保存递增序列,reverse()保存递减序列
我的代码:
UP = L[:]UP.sort()DOWN = UP[:]DOWN.reverse()if L==UP:print 'UP'elif L==DOWN:    print 'DOWN'else:    print 'WRONG'

相同数字 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(894|2346)38.11% 

描述:
给你一个整数列表L,判断L中是否存在相同的数字,若存在,输出YES,否则输出NO。

我的代码:(list和set)

import mathx = set(L)if len(L)==len(x):print 'NO'else:print 'YES'

加油站 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(443|1469)30.16% 

描述:
一个环形的公路上有n个加油站,编号为0,1,2,...n-1,每个加油站加油都有一个上限,保存在列表limit中,即limit[i]为第i个加油站加油的上限,而从第i个加油站开车开到第(i+1)%n个加油站需要cost[i]升油,cost为一个列表。现在有一辆开始时没有油的车,要从一个加油站出发绕这个公路跑一圈回到起点。给你整数n,列表limit和列表cost,你来判断能否完成任务。如果能够完成任务,输出起始的加油站编号,如果有多个,输出编号最小的。如果不能完成任务,输出-1。
我的代码:枚举
n=8limit =[ 0,2,3,4,5,6,7,8]cost=[1,2,3,4,5,6,7,8]res=[]for i in range(0,n):    sum=0    x=i    flag=0    for j in range(x,x+n):    sum=sum+limit[j%n]-cost[j%n] #每次会有剩余的累加    if sum<0:            flag=1            break    if flag==0:    res.append(i)res.sort()if len(res)==0:print '-1'else:    print res[0]

山峰的个数 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(662|1685)39.29% 

描述:
十一假期,小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]sum=0for i in range(1,len(h)-1):if(h[i]>h[i-1] and h[i]>h[i+1]):sum = sum +1print sum

大幂次运算 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(574|1929)29.76% 

描述:
给你两个正整数a(0 < a < 100000)和n(0 <= n <=100000000000),计算(a^n) % 20132013并输出结果
我的代码:
import mathprint pow(a,n,20132013)

密码生成 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(196|2297)8.53% 

描述:
生活在当代社会,我们要记住很多密码,银行卡,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

我的代码:
def divide(a,b,c,d):    result=""    a=(a*pow(10,c-1,b))%b #小数点后一位的被除数    for i in range(0,d-c+1):        a=(a%b)*10        result=result+str(a/b)    return resultprint divide(a,b,x,y)

最大连续子序列 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(513|1384)37.07% 

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

我的代码:
now=0sum=0t=0for x in L:if x<0:t+=1now+=xif now>sum:sum=nowif now<0:now=0if t==len(L):L.sort()print L[0]else:print sum

最大非连续子序列 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(328|806)40.69% 

描述:
给你一个整数list L, 如 L=[2,-3,3,50], 求L的一个非连续子序列,使其和最大,输出最大子序列的和。这里非连续子序列的定义是,子序列中任意相邻的两个数在原序列里都不相邻。例如,对于L=[2,-3,3,50], 输出52(分析:很明显,该列表最大非连续子序列为[2,50]).
我的代码:
用一个now变量开始保存L[0],0中的最大值,当i=2是加上now(L[0],0)
当i=3时加上now(max(L[2:0]
def GNC(l):          #最大非连续子序列if len(L)<=2:return max(L)now=max(L[0],0)print nowfor i in range(2,len(L)):L[i]+=nownow=max(now,L[i-1])#比较后一个和后两个的最大值return max(L)print GNC(L)

简单题之勾股定理 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(559|1235)45.26% 

描述:
给你直角三角形的两个直角边的边长a,b,请你求出其斜边边长,结果保留小数点后三位小数。如a=3, b =4, 则输出5.000。
我的代码:
import mathc=math.sqrt(a*a+b*b)print("{:.3f}".format(c))

简单题之列表转换 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(617|877)70.35% 

描述:
给你一个字符串列表L,请用一行代码将列表所有元素拼接成一个字符串并输出。如L=['abc','d','efg'], 则输出abcdefg。
我的代码:
res=""for x in L:res+=xprint res

简单题之输出格式练习 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(593|920)64.46% 

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

我的代码:

for x in range(0,len(L)):    if x<len(L)-1:    print L[x],    else:    print L[len(L)-1]

Py数 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(356|689)51.67% 

描述:
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。
我的代码:
def Xbin(n,x):sum = 0,而n> 0:sum + = n%x n / = x 返回和a = Xbin(n,10)b = Xbin(n,16)c = Xbin(n, )如果一个== b和b == c:print“Yes” else:print“No”

分拆素数和 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(367|1107)33.15% 

描述:
把一个偶数拆成两个不同素数的和,有几种拆法呢?现在来考虑考虑这个问题,给你一个不超过10000的正的偶数n,计算将该数拆成两个不同的素数之和的方法数,并输出。如n=10,可以拆成3+7,只有这一种方法,因此输出1.

我的代码:
f = lambda x: all([x%c!=0 for c in range(2,x)])p = [x for x in range(2,n) if f(x)]sum=0for x in range(0,len(p)):for y in range(x,len(p)):if p[x]+p[y]==n and p[x]!=p[y]:sum+=1print sum

取石子游戏 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(162|507)31.95% 

描述:
有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目a和b,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。如果你是胜者,输出Win,否则输出Loose。例如,a=3,b=1, 则输出Win(你先在a中取一个,此时a=2,b=1,此时无论对方怎么取,你都能将所有石子都拿走).
威佐夫博弈问题,详解参考:点击打开链接
我的代码:
import mathif a<b:t=aa=bb=tk=a-ba=(int)(k*(1+5.0**0.5)/2.0)if a==b:print "Loose"else:    print "Win"

最小公倍数I 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(169|358)47.21% 

描述:
给你一个正整数list L, 如 L=[2,8,3,50], 求列表中所有数的最小公倍数(不用考虑溢出问题)。如L=[3,5,10], 则输出30
我的代码:
def gdy(n,m):if n<m:t=nn=mm=tif m==0:return nelse:return gdy(m,n%m)L=[3,5,10]max=1for x in L:max=(max*x)/gdy(max,x)print max

特殊回文数 
讨论此题 | 解题报告 
 (AC/Submit)Ratio(15|60)25.00% 

描述:
123321是一个非常特殊的数,它从左边读和从右边读是一样的。给你一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n(1<=n<=54)。按从小到大的顺序输出满足条件的整数,每个整数占一行,例如:n = 52, 则输出:899998989989998899

我的代码:(直接构造五位数和六位数)
a=[]n=52for x in range(1,10):    for y in range(10):        for z in range(10):            if x*2+y*2+z==n:                a.append(x*10001+y*1010+z*100)            if x*2+y*2+z*2==n:                a.append(x*100001+y*10010+z*1100)a.sort()for i in a:    print i



原创粉丝点击