PAT 1041. Be Unique (20)
很简单的一道题,不过要是相应的数据结构以及方法选择不好,会变得很烦,在牛客上居然看到了有人建树来解决。这里分享一下解题方法,此题可以算是一道可以利用位图排序(也有叫做查询表)来做的非常经典的题。
位图思想排序非常简单(有不熟悉的同学可以看下):
建一个flag数组,记录相应数字出现的个数,初始化为0, 每输入一个数,记为temp,同时将做运算,flag[temp]++。当输入完成的时候,输入的数据就已经完成了排序。如果要按序输出:
/*这里假设total为输入数据的个数,且要排序的数均为正数。
仅仅给出遍历的思想,具体问题不同,可以采用其他的STL,
如vector, hash_map具体实现来降低时间复杂度*/
int count = 0;
for(int i = 0; count<=total; ++i) {
while(flag[i]>0) {
printf("%d ", i);
--flag[i];
++count;
}
}
下面贴上解题代码,想法与上面提及的位图排序相似
#include <cstdio>
#define MAX 999999
int arr[MAX];
int flag[MAX] = {0};
int total;
int main()
{
scanf("%d", &total);
for(int i = 0; i<total; i++) {
scanf("%d", &arr[i]);
flag[arr[i]]++;
}
for(int i = 0; i<total; i++) {
if(flag[arr[i]] == 1) {
printf("%d", arr[i]);
return 0;
}
}
printf("None");
return 0;
}