天天看點

python 面試題 aac caa相似_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

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