题目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
o,r=i,r
while 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
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
count2 +=2;
str2 = L[i-k]+str2+L[i+k-1];
k +=1;
if count2>s2:
s2 = count2;
s22 = str2;
print [s11,s22][s1
题目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