您的位置:首页 > 编程语言 > Python开发

Python Tip(51~55)题详解

2017-02-04 17:55 337 查看

题目51.降序排序

描述:给你一个list L, 如 L=[2,8,3,50], 对L进行降序排序并输出,

如样例L的结果为[50,8,3,2]

答案:先排序,再逆序输出

L.sort()
print L[::-1]


题目52.因子平方和

描述: 6 的因子有 1, 2, 3 和 6, 它们的平方和是 1 + 4 + 9 + 36 = 50. 如果 f(N) 代表正整数 N 所有因子的平方和, 那么 f(6) = 50.

现在令 F 代表 f 的求和函数, 亦即 F(N) = f(1) + f(2) + .. + f(N), 显然 F 一开始的 6 个值是: 1, 6, 16, 37, 63 和 113.

那么对于任意给定的整数 N (1 <= N <= 10^8), 输出 F(N) 的值.

答案:

def f(n):
num = 0
for i in xrange(1,n/2+1):
num +=(n/i-1) * (i**2)
num += (n*(n+1)*(2*n+1))/6
return num

print f(N)


题目53.神の安♂排

描述:记得有一次全班去唱K, 其中有个活动是情歌对唱. 具体操作流程是这样的:

准备好 21 个阄(我们班 15 男 6 女), 其中只有两个是有标记的, 每人随意抓取一个, 最后取到有标记的阄的两个人去点首情歌对唱.

旁边一哥们儿幽幽地对我说, 看来搅基真是神的安排啊, 你看我们班的男女人数, 搅基的几率 C(15,2)/C(21,2) 刚好是 1/2.

给跪了, 这哥们儿对数字太敏感了, 简直是拉马努金转世啊. 不过我随之想到一个问题: (21, 15) 真的是神的唯一安排吗? 其实不是的,

神还有很多类似的安排. 比如 (4, 3), 显然 C(4,2)/C(3,2) 也等于 1/2, 当然还有 (120, 85) 等等等等.

神的安排太多太多了, 如果我们定义 (n, m) 是一个安排(其中 1 < m < n), 而如果 C(m,2)/C(n,2) = 1/2, 它就是神的安排.

现在的问题是, 给你一个不大于 10^9 的正整数 N, 有多少组神的安排 (n, m) 满足 n <= N 呢?

答案:具体参考 关于求解不定方程的n(n-1)=2m(m-1)的解法的总结

cnt = 0
x,y=1,1
while x<= 2*N-1:
x,y=3*x+4*y,2*x+3*y
if x > 2*N-1:
break
if x%2 and y%2:
cnt +=1
print cnt


题目54.最长回文子串可不简单

描述:记得一副有趣的对联: “雾锁山头山锁雾, 天连水尾水连天”, 上联和下联都是回文的.

当然类似的还有: “上海自来水水来自海上, 山西悬空寺寺空悬西山”.

回文是什么意思? 就是把内容反过来读也是和原来一样的, 譬如 abccba, xyzyx, 这些都是回文的.

然而我们更感兴趣的是在一个英文字符串 L 中, 怎么找出最长的回文子串.

例如 L = “caayyhheehhbbbhhjhhyyaac”, 那么它最长的回文子串是 “hhbbbhh”.

这个任务看似简单, 但是如果我告诉你 L 的长度可能会接近 10^4, 问题似乎就变麻烦了.

不管怎么说, 加油吧骚年.

答案:

方法一: 中心法

L = '#'.join(list(L)) # len is odd now!
l = len(L)

o,r=0,0 # 圆心,半径(不计圆心)
for i in range(1,l):
if i+r<l and L[i-r:i] == L[i+r:i:-1]: # 移到:最右方便来计算
o,r=i,r
while i+r+1<l and L[i-r-1] == L[i+r+1]:
r += 1
# print L[o-r:o+r+1]

L1 = L[o-r:o+r+1]
t1,t2 = L1[::2],L1[1::2]

print t1 if any(i!='#' for i in t1) else t2


方法二:

s1 = 0;
s11 = "";
s2 = 0;
s22 = "";
for i in range(1,len(L)-1):
count1 = 1;
str1 = L[i];
k=1;
while i-k>=0 and i+k<len(L) and L[i-k]==L[i+k]:
count1 +=2;
str1 = L[i-k]+str1+L[i+k];
k +=1;
if count1>s1:
s1 = count1;
s11 = str1;
for i in range(1,len(L)):
count2 = 0;
str2 = "";
k=1;
while i-k>=0 and i+k-1<len(L) and  L[i+k-1]==L[i-k]:
count2 +=2;
str2 = L[i-k]+str2+L[i+k-1];
k +=1;
if count2>s2:
s2 = count2;
s22 = str2;
print [s11,s22][s1<s2];


题目55.那些年我们集过的卡片

描述:不知道大家的童年有没有过和我相似的经历。我记得小时候经常买干脆面,不为别的,只是因为里面有一张人物卡片。

其实有很多这样的活动都有一个相同的模式:N 种人物卡片,每次买一包干脆面随机得到一张。当你集齐这 N 种人物时,就会有相应的奖励。

那时候还不懂怎么计算概率,白白给人家送了好多钱,吃了好多干脆面。

现在的任务是,给你一个正整数 N (1 <= N <= 10^4),请你帮我从期望的角度计算平均需要买多少包干脆面才能集齐这 N 种人物。

提醒:由于结果可能不是整数,所以结果只保留到小数点后两位。

答案:

ans = 0
for i in range(N, 0, -1):
ans = ans+ N*1.0/i
print "%.2f" % ans
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: