PythonTip 50道题目(部分题解)

PythonTip 50道题目(部分题解)_第1张图片

一马当先 

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

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

                                 
                                                                                                          格式化时间  

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

描述:
给你一个时间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
                                                             

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

描述:
给你一个整数组成的列表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'

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

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

我的代码:(list和set)

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

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

描述:
一个环形的公路上有n个加油站,编号为0,1,2,...n-1,
每个加油站加油都有一个上限,保存在列表limit中,即limit[i]为第i个加油站加油的上限,
而从第i个加油站开车开到第(i+1)%n个加油站需要cost[i]升油,cost为一个列表。
现在有一辆开始时没有油的车,要从一个加油站出发绕这个公路跑一圈回到起点。
给你整数n,列表limit和列表cost,你来判断能否完成任务。
如果能够完成任务,输出起始的加油站编号,如果有多个,输出编号最小的。
如果不能完成任务,输出-1。
我的代码:枚举
n=8
limit =[ 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]

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

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

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

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

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

描述:
生活在当代社会,我们要记住很多密码,银行卡,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 result
print divide(a,b,x,y)

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

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

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

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

描述:
给你一个整数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 now
	for i in range(2,len(L)):
		L[i]+=now
		now=max(now,L[i-1])#比较后一个和后两个的最大值
	return max(L)
print GNC(L)

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

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

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

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

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

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

我的代码:

for x in range(0,len(L)):
    if x

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

描述:
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”

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

描述:
把一个偶数拆成两个不同素数的和,有几种拆法呢?
现在来考虑考虑这个问题,给你一个不超过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=0
for 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+=1
print sum

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

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

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

描述:
给你一个正整数list L, 如 L=[2,8,3,50], 求列表中所有数的最小公倍数(不用考虑溢出问题)。
如L=[3,5,10], 则输出30
我的代码:
def gdy(n,m):
	if n

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

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

我的代码:(直接构造五位数和六位数)
a=[]
n=52
for 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



你可能感兴趣的:(【Python】)