剑指Offer----扩展:有趣的数字(腾讯)

原创 2016年08月28日 16:25:07

问题描述:


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

输入描述:
输入包含多组测试数据。对于每组测试数据:
N - 本组测试数据有n个数
a1,a2...an - 需要计算的数据
保证:1<=N<=100000,0<=ai<=INT_MAX.

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

输入例子:
6
45 12 45 32 5 6

输出例子:
1 2

方法一:


分析:使用一个容器,将数组中两两数之差的绝对值放到到map容器中,如果差值相同,则map中对应的值加1,这种方法的缺点就是时间复杂度高,空间复杂度也高!!!双高!!!但是最容易想到!!!


源代码:

#include<iostream>
#include<map>

using namespace std;

int main()
{
	int n;
	while (cin>>n)
	{
		int *arr = new int[n];
		for (int i = 0; i < n; ++i)
			cin >> arr[i];

		map<int, int> mmap;
		int max = -INT_MAX;
		int min = INT_MAX;
		for (int i = 0; i < n - 1; ++i)
		{
			for (int j = i+1; j < n; ++j)
			{
				int result = arr[i] - arr[j];
				result = result >= 0 ? result : -result;
				if (result < min)
					min = result;
				if (result > max)
					max = result;
				
				mmap[result]++;
			}
		}

		cout << mmap[min] << " " << mmap[max] << endl;
		delete[] arr;

	}

	cout << __DATE__ << "  " << __TIME__ << endl;
	system("pause");
	return 0;
}

运行结果:
6
1 2 3 4 5 6
5 1
6
1 1 2 2 3 3
3 4
6
1 1 1 1 1 1
15 15
^Z
Aug 28 2016  16:30:47
请按任意键继续. . .


方法二:

分析:先将数组排序,那么最大的差值肯定就是最大数减去最小数,最小的差值肯定就是两个相邻数的差值,还有就是特殊情况的处理,当数组中所有的数字都相同的时候的处理,当最小的差值为0的时候的情况的处理!


源代码:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
	int n;
	while (cin >> n)
	{
		if (n == 1)//如果只有一个数字的话
		{
			cout << 0 << " " << 0 << endl;
			continue;
		}

		if (n == 2)//如果只有两个数字的话
		{
			cout << 1 << " " << 1 << endl;
		}

		//含有3个以上的数字
		vector<int> data;
		while (n--)
		{
			int temp;
			cin >> temp;
			data.push_back(temp);
		}

		int len = data.size();
		sort(data.begin(), data.end());
		int min = data[1] - data[0];//最小的差值不一定是是头两个元素之差,但一定是相邻的元素之差
		for (int i = 2; i < len; ++i)
		{
			if ((data[i] - data[i - 1]) < min)
				min = data[i] - data[i - 1];
		}
		int min_count = 0;
		if (min == 0)//此时,应该找到元素相同的区域块,可能有很多块
		{
			for (int i = 1; i < len; ++i)
			{
				int j = i - 1;
				while (j >= 0 && data[i] == data[j])
				{
					++min_count;
					--j;
				}
			}
		}
		else//此时,应该是两个相邻的元素只差
		{
			for (int i = 1; i < len; ++i)
			{
				if ((data[i] - data[i - 1]) == min)
					min_count++;
			}
		}


		//最大差的数肯定是最右边的数减去最左边的数
		int max = data[len - 1] - data[0];
		int max_count = 0;
		//如果最大的数字不等于最小的数字,则统计最小数字的个数,统计最大数字的个数,相乘既得结果
		if (data[0] != data[len - 1])
		{
			int num_min = 1;
			for (int i = 1; i < len - 1; ++i)
			{
				if (data[i] == data[0])
					num_min++;
				else
					break;
			}

			int num_max = 1;
			for (int i = len - 2; i >= 0; --i)
			{
				if (data[i] == data[len - 1])
					num_max++;
				else
					break;
			}

			max_count = num_min*num_max;
		}
		else//如果最大的数字等于最小的数字
		{
			max_count = len*(len - 1) / 2;
		}
		cout << min_count << " " << max_count << endl;
	}

	cout << __DATE__ << "  " << __TIME__ << endl;
	system("pause");
	return 0;
}

运行结果:
6
1 2 3 4 5 6
5 1
6
1 1 2 2 3 3
3 4
6
1 1 1 1 1 1
15 15
^Z
Aug 28 2016  16:34:42
请按任意键继续. . .






版权声明:本文为博主原创文章,未经博主允许不得转载。

剑指Offer(java答案)

剑指Offer(java答案)剑指Offerjava答案 5从尾到头打印链表 6重建二叉树 33把数组排成最小的数 34丑数 35第一个只出现一次的字符 36数组中的逆序对 37两个链表的第一个公共交...
  • sinat_29912455
  • sinat_29912455
  • 2016年04月12日 21:23
  • 4775

剑指offer题目及答案

剑指offer最近在牛客网上刷剑指offer的题目,现将题目和答案总结如下
  • panda_AJ
  • panda_AJ
  • 2017年04月06日 19:07
  • 1613

剑指offer—二进制中1的个数

面试题10:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。首先对于二进制1的求解,在这里...
  • qq_26768741
  • qq_26768741
  • 2016年05月09日 23:56
  • 3075

剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

腾讯 2015秋招 编程题4:微信红包中个数超过总数一半的红包金额 题目描述 春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一...
  • yanglr2010
  • yanglr2010
  • 2016年05月14日 22:24
  • 1207

剑指Offer----扩展:字符移位(腾讯)

问题描述: 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。你能帮帮小Q吗? 输入描述:输入数据有多组,每组包含一个字符串s,且保证...
  • qianqin_2014
  • qianqin_2014
  • 2016年08月28日 13:41
  • 281

[腾讯校招] 有趣的数字

题目:小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?输入描述: 输入包含多组测试数据。 对于每组测试数据: N - 本组测试数据有n个数 a...
  • wangwenhao00
  • wangwenhao00
  • 2017年01月17日 17:34
  • 215

腾讯2017 暑假实习生编程题---【3】 有趣的数字

Q:小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? A:之前尝试过暴力解决,结果有内存限制不让过。。。 import java.util.*; ...
  • OldDreamHYN
  • OldDreamHYN
  • 2017年02月10日 20:00
  • 141

腾讯2017暑假实习生编程题有趣的数字

小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差的绝对值最小的有多少对呢?差的绝对值最大的呢? 输入描述: 输入包含多组测试数据。 对于每组测试数据: N...
  • qq_23511107
  • qq_23511107
  • 2016年08月04日 14:50
  • 329

腾讯2017暑期实习生编程题:有趣的数字 [python]

''' [编程题] 有趣的数字 时间限制:1秒 空间限制:32768K 小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 输入描述:...
  • qq_34617032
  • qq_34617032
  • 2017年11月22日 15:20
  • 52

腾讯2017年实习生编程题目(第三题)——有趣的数字 小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

腾讯2017年实习生编程题目(第三题) 3.有趣的数字 小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 输入描述:  输入包含多组测试数据。  对于每组测试...
  • u013000638
  • u013000638
  • 2016年09月09日 15:10
  • 1366
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指Offer----扩展:有趣的数字(腾讯)
举报原因:
原因补充:

(最多只允许输入30个字)