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。
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"。
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。
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]).
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
- PythonTip 50道题目(部分题解)
- Codeforces 部分题目题解(口胡)
- Regionals 2013 Asia - Daejeon (部分题目题解)
- pythonTip
- 2017年上海金马五校程序设计竞赛(网上资格赛)部分题目题解
- CheckIO题解:OLD LIBRAY 里的部分题目
- 福州大学第十一届程序设计竞赛 部分题目题解
- PAT 团体程序设计天梯赛 部分题目题解
- 第九届河南省省赛题目部分题解
- SNNU2017校赛(部分)题解
- 是男人就做的50道题目 题解
- leetcode部分题目(C++)
- 北京赛区 两道题目的题解
- NYIST_12周赛(一)题目题解
- 博弈题目集结+题解(不定期更新)
- POJ数据结构专辑(含部分题解)
- POJ数据结构专辑(含部分题解)
- 2015湖南省acm省赛赛题解(部分)
- 【XML】将String格式的XML文件转化成JAVA实体类
- 算法笔记--排列组合
- HDU 2071 Max Num
- 二分搜索—— 完全二叉树统计节点个数
- LeetCode 563 Binary Tree Tilt(递归 + 中间结果保存)
- PythonTip 50道题目(部分题解)
- nefuoj1206-dp-环形子段和
- Java Integer的缓存问题
- 网址收藏
- Alphago原理浅析
- strcat,strncat函数
- Spring Cloud探路(三)REST 客户端Feign
- CSDN博客积分规则
- python基础教程---更加抽象,类,继承多态封装