1. 程式人生 > >python進階程式設計_3_最大數,最小數的統計

python進階程式設計_3_最大數,最小數的統計

時間限制:1秒

空間限制:32768K

小Q今天在上廁所時想到了這個問題:有n個數,兩兩組成二元組,差最小的有多少對呢?差最大呢?
輸入描述:

輸入包含多組測試資料。 對於每組測試資料: N - 本組測試資料有n個數 a1,a2...an - 需要計算的資料 保證: 1<=N<=100000,0<=ai<=INT_MAX.

輸出描述:

對於每組資料,輸出兩個數,第一個數表示差最小的對數,第二個數表示差最大的對數。


輸入例子1:
6
45 12 45 32 5 6

輸出例子1:
1 2

# -*- coding: utf-8 -*-  
def f(nums, N):  
    _min, _max = nums[0], nums[-1]# nums最大值和最小值  
    #極端情況,所有數字都一樣  
    if _min == _max:  
        return str(N*(N-1)/2) + ' ' + str(N*(N-1)/2)       
    ret_max, ret_min = 0, 0# 返回值引數  
       
    #尋找最大差值對數  
    ret_max = nums.count(_min) * nums.count(_max)# 最大差值對數  
       
    #尋找最小差值對數 ,非零的情況,將每出現結果為最小的差值更新,每重複一次值加一
    min_dif = float('inf')# 最小差值初始化維正無窮  
    for i in range(N-1):# 迴圈尋找最小差值對數,ret_min表示最小差值對數  
        diff = nums[i+1] - nums[i]  
        if diff < min_dif:  
            ret_min = 1  
            min_dif = diff  
        elif diff == min_dif:  
            ret_min += 1
    #上式判斷程式碼只能保證非零差值的統計,一旦差值結果為0,
    #則必須將每一階段差值為0分開討論而且還要重新組合統計
    # 極端情況,存在差值為0,這時需要重新判斷  
    if min_dif == 0:  
        count = 0  #用於統計當前排列小段中大小相等的元素的個數
        ret_min = 0  
        for i in range(N-1):  
            if nums[i+1] == nums[i]:  
                count += 1  
            else:  
                if count > 0:# 因為上面count初始值為0,因此實際上count應該再+1
                    #count=count+1
                    #ret_min+=count*(count-1)/2
                    ret_min += count*(count+1)/2#從count個數選出2個  
                    count = 0  
        #在最後的一小段中
        #可能一直是nums[i+1] == nums[i],沒有else,因此還需要在加一個  
        #如果count=0則不影響最後結果  
        ret_min += count*(count+1)/2  
        ret_min=int(ret_min)
    return str(ret_min) + ' ' + str(ret_max)  

if __name__ == '__main__':  
    while 1:  
        try:  
            N =int( input()  )
            nums = list(map(int,input().strip().split()) )
        except:  
            break  
        nums.sort()  
        print (f(nums, N) )