面試題:小明看花

題目:小明有一個花園,花園裏一共有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();
		}
		
	}		
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章