面试题:小明看花

题目:小明有一个花园,花园里一共有m朵花,对于每一朵花,都是不一样的,小明用1~m中的一个整数表示每一朵花,他很喜欢去看花,有一天他看了n次,并将n次他看花的种类是什么按照时间顺序记录下来。记录用a[i]表示,表示第i次他看了a[i]这朵花。小红很好奇,她有Q个问题,问(l,r)的时间内,小明一共看了多少朵不同的花儿。

输入:

  • 输入两个数n,m(1=<n<=2000,1=<m=<100):分别表示n次看花,m表示一共有m朵花儿
  • 输入n个数a[1]~a[n],a[i]表示第i次,小明看的花的种类
  • 输入一个数Q(1=<Q=<1000000),表示小红的问题数量
  • 输入Q行,每行两个数(r(1=<l=<r=<n))表示小红想知道在第l次到第r次,小明一共看了多少不同的花

输出:

  • 一共Q行
  • 每一行输出一个数,表示小明在(l,r)的时间内看了多少种花

样例输入:

5 3
1 2 3 2 2
3
1 4
2 4
1 5

样例输出:

3
2
3

代码:

        代码用的是最粗暴的方法,而且数据类型被我定义成了int,实际上也有很大的问题,因为n、m、甚至是Q,都是很大的值(最大的为1000000),所以最好将数据类型定义为long long型。。。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<vector>
#include<map>
using namespace std;
int main()
{
	int n, m;
	cout << "请输入看花的次数n和花的种类m:";
	cin >> n >> m;
	vector<int> array(n);
	int i,j;
	cout << "请输入n次看花的花的种类:";
	for (i = 0; i < n; i++)
		cin >> array[i];
	//for (i = 0; i < n; i++)
		//cout << array[i];
	int Q;
	cout << "请输入小红的问题个数:";
	while (scanf("%d", &Q) != EOF)
	{
		vector<vector<int>> nQ(Q, vector<int>(2));
		cout << "请输入小红的问题:";
		for (i = 0; i < Q; i++)
		{
			for (j = 0; j < 2; j++)
				scanf("%d", &nQ[i][j]);
		}
		int left, right;
		map<int, int> item;
		for (i = 0; i < Q; i++)
		{
			left = nQ[i][0];
			right = nQ[i][1];
			cout << left << right << endl;
			for (j = left-1; j < right; j++)
			{
				//cout << left << right << endl;
				cout << j << " ";
				cout << "array[j]:"<<array[j]<<endl;
				item[array[j]]++;					
			}
			cout << "result:";
			cout << item.size() << endl;
			item.clear();
		}
		
	}		
}

猜你喜欢

转载自blog.csdn.net/baidu_32936911/article/details/82144042