腾讯笔试编程题:两两二元组差最小最大对数(C++)

题目:

小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

输入描述:

输入包含多组测试数据。

对于每组测试数据:

N - 本组测试数据有n个数

a1,a2…an - 需要计算的数据

保证:

1<=N<=100000,0<=ai<=INT_MAX.

输出描述:

对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。

输入例子:

6
45 12 45 32 5 6

输出例子:

1 2

思路:

先排序,然后对有序数组分别求差值最大的对数和差值最小的对数。

排序之后,

  1. 差值最大的好求,看有序数组有几个最小值和几个最大值,相乘即可。

  2. 差值最小的,由于是有序数组,必定是相邻的差值较小,故由排序后的有序数组求出差值最小值。如果差值最小值为0,则算出数组中相等的元素的对数;如果差值最小值不为0,则只需计算有多少个最小值即可。

答案:

#include 
#include 
#include 
using namespace std;



int main(){

    int n;

    while (cin>>n) {
        vector<int> nums(n);
        for (int i=0; icin>>nums[i];
        }

        int minNum=0, maxNum=0;
        //排序
        sort(nums.begin(), nums.end());

        //最大
        int m1 = 0, m2 = n-1, a=1, b=1;
        while (nums[m1+1] == nums[m1]) {
            a++;
            m1++;
        }

        while (nums[m2] == nums[m2-1]) {
            b++;
            m2--;
        }
        maxNum = a*b;

        //最小
        int minTemp=nums[n-1];
        for (int i=1; iif (nums[i]-nums[i-1]1];
            }
        }

        if (minTemp >0) {

            for (int i=1; iif (nums[i]-nums[i-1] == minTemp) {
                    minNum++;
                }
            }

        }else{

            for (int i=1; iint j=i-1;
                while (nums[j]==nums[i] && j>=0) {
                    minNum++;
                    j--;
                }
            }
        }

        cout<" "<return 0;
}

你可能感兴趣的:(面试题目,C++)