Python Tip(51~55)题详解

题目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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值