傳聞中的華為Python面試題(原創)

2022-07-18 17:48:11 字數 2494 閱讀 1196

原題:

有兩個序列a,b,大小都為n,序列元素的值任意整形數,無序;

要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小

限時十分鐘以內

嘗試解答,coding和debug共用了約1個小時,呵呵,去不了華為了。

獲取最小差的函式,還可以優化,現在的時間複雜度是n×n,估計可以優化到n×lg(n)

網上有一種解答方法,認為最小值是負數,排序之後,截成兩段,小數序列-大數序列即可。難道,難道,這才是本題十分鐘解出的奧義?!

'''

created on 2010-6-21

@author: maodouzi

'''import random

def getminsubkeys(leftarray, rightarray):

if (sum(leftarray) > sum(rightarray)):

subarray = leftarray

minuendarray = rightarray

subflag = true

elif (sum(leftarray) < sum(rightarray)):

subarray = rightarray

minuendarray = leftarray

subflag = false

else:

return none

minsubnum = (sum(subarray) - sum(minuendarray)) / 2.0

tmpminsubresult = sum(subarray)

subkey = 0

minuendkey = 0

for i_key, i in enumerate(subarray):

for j_key, j in enumerate(minuendarray):

if (abs(i - j - minsubnum) < tmpminsubresult):

tmpminsubresult = abs(i - j - minsubnum)

subkey = i_key

minuendkey = j_key

if (subflag == true):

return (subkey, minuendkey)

else:

return (minuendkey, subkey)

if __name__ == '__main__':

aa = range(20);

bb = [random.randint(0, 100) for i in aa]

bb.sort(reverse=true)

print aa

print bb

leftarray =

rightarray =

while (len(bb)):

tmpnumarray = bb[0:2]

bb = bb[2:]

if (sum(leftarray) <= sum(rightarray)):

else :

leftarray.sort()

rightarray.sort()

tmpkeyarray = getminsubkeys(leftarray, rightarray)

if (tmpkeyarray == none):

continue

else:

orgsubnum = abs(sum(leftarray) - sum(rightarray));

newsubnum = abs(orgsubnum + (rightarray[tmpkeyarray[1]] - leftarray[tmpkeyarray[0]]) * 2)

if (newsubnum < orgsubnum):

tmpnum = leftarray[tmpkeyarray[0]]

leftarray[tmpkeyarray[0]] = rightarray[tmpkeyarray[1]]

rightarray[tmpkeyarray[1]] = tmpnum

leftarray.sort()

rightarray.sort()

print leftarray, sum(leftarray)

print rightarray, sum(rightarray)

print "the subnum is: %d" % abs(sum(leftarray) - sum(rightarray))

輸出結果如下:

[93, 91, 90, 82, 81, 74, 74, 74, 74, 68, 60, 57, 49, 48, 48, 45, 36, 35, 29, 22]

[22, 36, 48, 48, 60, 68, 74, 81, 82, 93] 612

[29, 35, 45, 49, 57, 74, 74, 74, 90, 91] 618

the subnum is: 6

華為Python面試題

最近在網上偶然看到此題 有兩個序列a,b,大小都為n,序列元素的值任意整形數,無序 要求 通過交換a,b中的元素,使 序列a元素的和 與 序列b元素的和 之間的差最小 經過一番思索,我試著用窮舉法來解一下這道題,大概思路如下 1 分別求a,b序列元素之和sum a sum b 2 算出min abs...

華為面試題

1 區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域性變數...

華為面試題

三 1 區域性變數能否和全域性變數重名?答案 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域...