原題:
有兩個序列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 區域性變數能否和全域性變數重名?答案 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域...