您的位置:首页 > 其它

计数与排序问题

2011-04-09 13:14 204 查看
2011-04-09 wcdj



问题描述:

将N(1<= N <= 200000)个整数从小到大连续编号,相同的数应具有相同的编号。并按这N个数输入时的顺序输出它们的编号序列。例如,设输入数据为 5 3 4 7 3 5 6,则输出数据为3 1 2 5 1 3 4。



【输入形式】

从标准输入读取数据。

输入包含N个数字(1<= N <= 200000),之间由空格分隔,以回车符作为结束。



【输出形式】

计算结果输出到标准输出。

按这N个数输入时的顺序输出它们的编号序列。每个序号之后紧跟一个空格符,最后输出回车符。



【输入样例】

5 3 4 7 3 5 6



【输出样例】

3 1 2 5 1 3 4

方法1:不排序

时间复杂度:O(N^2)

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
#define N 200000
int data
;
int map
;
int main()
{
	int i = 0, tmp = 0, cnt = 0, len = 0;
	string input;
	getline(cin, input);
	istringstream input_istring(input);
	char s[12]="";
	while (input_istring.getline(s, 12, ' '))
	{
		tmp = atoi(s);
		data[i++] = tmp;
		map[tmp] = 1;
	}
	len = i;
	i = 0;
	for (int j = 0; j<N; ++j)
	{
		if (map[j] == 1)
		{
			++cnt;	
			if (j == data[i])
			{
				cout<<cnt<<" ";
				++i;
				j = 0;
				cnt = 0;
			}					
		}
		if (i == len) break;			
	}
	cout<<endl;
	return 0;
}





方法2:排序

时间复杂度:O(N*lbN)

#include <stdio.h>
int A[200001];
int A2[200001];
int B[100001];
void swap(int* a, int* b)
{
	int t = *a;
	*a = *b;
	*b = t;
}
void qsort(int a[], int l, int r)
{
	int i = l;
	int j = r;
	int k = a[(i + j) / 2];
	while (i < j)
	{
		for (; (i < r) && (a[i] < k); ++i);
		for (; (j > l) && (a[j] > k); --j);
		if (i <= j)
		{
			swap(&a[i], &a[j]);
			++i;
			--j;
		}
	}
	if (i < r)
	{
		qsort(a, i, r);
	}
	if (j > l)
	{
		qsort(a, l, j);
	}
}
int main()
{
	int m = 1, n = 0, i =0;
	while (scanf("%d", &A[++n]) != EOF)
	{
		if ((i = getchar()) == '/n')
		{
			break;
		}
	}
	for (i = 1; i <= n; ++i)
	{
		A2[i] = A[i];
	}
	qsort(A2, 1, n);
	B[A2[1]] = m;
	for (i = 2; i <= n; ++i)
	{
		if (A2[i] == A2[i - 1])
		{
			continue;
		}
		else
		{
			B[A2[i]] = ++m;
		}
	}
	for (i = 1; i <= n; ++i)
	{
		printf("%d ", B[A[i]]);
	}
	printf("/n");
	return 0;
}





方法3:使用stl中的map

#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
vector<int> input,rec;
map<int,int> update;
int n;
int main()
{
	int num, ch;
	while (cin>>num)
	{
		input.push_back(num);
		rec.push_back(num);
		if ((ch = getchar()) == '/n')
		{
			break;
		}
	}
	sort(input.begin(),input.end());// 排序
	int cnt=0;
	for(vector<int>::iterator iter=input.begin();iter!=input.end();++iter)
	{
		if(update.count(*iter)==0)
		{
			update[*iter] = ++cnt;
		}
	}
	for(vector<int>::iterator it=rec.begin(); it!=rec.end(); ++it)
	{
		cout<<update[*it]<<" ";
	}
	cout<<endl;
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: