騰訊筆試程式設計題--小Q上廁所
阿新 • • 發佈:2018-12-30
題目
小Q今天在上廁所時想到了這個問題:有n個數,兩兩組成二元組,差最小的有多少對呢?差最大呢?
輸入
輸入包含多組測試資料。
對於每組測試資料:
N - 本組測試資料有n個數
a1,a2…an - 需要計算的資料
保證:
1<=N<=100000,0<=ai<=INT_MAX.
輸出
對於每組資料,輸出兩個數,第一個數表示差最小的對數,第二個數表示差最大的對數。
輸入例子:
6
45 12 45 32 5 6
輸出例子:
1 2
思路
先對給定的陣列進行排序,最大差的對數就是陣列最小數的個數乘最大數的個數。最小差的產生對於有序的陣列肯定是相鄰的數產生的,計算出最小差為多少;如果為0,則是相等的數產生了最小差,此時對與陣列的某個數a,計算他前面有多少個和他相等。如果不為0,迴圈計算出相鄰兩個數的差是否為最小差,對應的對數+1;對於為什麼是這樣,自己寫下就知道了。
程式碼實現:
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int find_num(int* a,int n,int val){
int k=0;
for(int i=0;i<n;i++){
if(val == a[i]){
k++;
}
}
return k;
}
int main(void) {
int n;
int a[100010 ];
while(cin>>n){
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int l,m,r;
int minNum,maxNum;
minNum = maxNum = 0;
l=find_num(a,n,a[0]);
r=find_num(a,n,a[n-1]);
maxNum = l*r;
int minDiv = a[1 ]-a[0];
for(int i=2;i<n;i++){
if(a[i]-a[i-1]<minDiv){
minDiv = a[i]-a[i-1];
}
}
if(minDiv == 0){
for(int i=1;i<n;i++){
int j=i-1;
while(a[j]==a[i] && j>=0){
minNum++;
j--;
}
}
}
else{
for(int i=1;i<n;i++){
if(a[i]-a[i-1] == minDiv)
minNum++;
}
}
cout<<minNum<<" "<<maxNum<<endl;
}
return 0;
}