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
相关文章推荐
- PythonTip(1~5)题详解
- PythonTip(11~15)题详解
- (翻译)Entity Framework技巧系列之十三 - Tip 51 - 55
- PythonTip(16~20)题详解
- Python Tip(41~45)题详解
- PythonTip(36~40)题详解
- PythonTip(6~10)题详解
- Python Tip(31~35)题详解
- LeetCode 55 Jump Game(Python 实现及详解)
- Entity Framework技巧系列之十三 - Tip 51 - 55
- PythonTip(21~25)题详解
- PythonTip(26~30)题详解
- Python Tip(46~50)题详解
- Python天天美味(34) - Decorators详解
- [Python Tip]判断输入是否被重定向了
- Python and django(四)--详解python中的数字和序列
- Python手工加载Django的实际操作的四部分详解
- Pamie模块详解 python操作ie浏览器
- Python嵌入C++详解(2)--Import Module
- Python之美--Decorator深入详解(一)