PAT (Advanced Level) 1041 Be Unique (20 分)
这个题理论上来说没什么好说的,处理效率和读入效率是一个级别的。
用C++来解决的话,开个vis数组即可。
- 然而Python Numpy库却给我开了天坑,理论上来说,Python的字典结构要优于列表结构,这是显然的,因为一个 O ( n ) O(n) O(n)级别的,另一个是 O ( l o g ( n ) ) O(log(n)) O(log(n))级别的。所以我就想,如果不使用字典这个题存在超时的可能。
- 然而,无论是使用列表还是字典,本题的效率相差不大,与C++相比也只是多了近5倍的时间,这还是勉强可以接受的。
- 但是,用了Numpy的数组最后两组数据妥妥超时!光是单纯的引入Numpy就需要 100 m s 100ms 100ms 而且将列表转换成数组的效率也极低,数组索引访问的效率也极低(难道不应该是 O ( 1 ) O(1) O(1)???)。这真的不禁让我崩溃及反思… …
- Numpy到底是怎么实现的(WTF???)。
列表的效率为什么比我想象的高那么多???
为什么列表和字典的效率相差不大,是数据水了嘛???
下面给出AC代码及效率对比图:
C++:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
#include<vector>
using namespace std;
#define ll long long int
#define INF 0x3f3f3f3f
const int maxn = 1e4 + 10;
const int maxm = 1e5 + 10;
int vis[maxn];
int a[maxm];
int main() {
memset(vis, 0, sizeof vis);
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
vis[a[i]]++;
}
int flag = 0;
for (int i = 1; i <= n; i++) {
if (vis[a[i]] == 1) {
flag = 1;
printf("%d\n", a[i]);
return 0;
}
}
if (flag == 0) {
puts("None");
}
return 0;
}
//_CRT_SECURE_NO_WARNINGS
Python:
-
使用Numpy的程序:
-
使用列表进行标记的程序
-
使用字典进行标记的程序
#from sys import stdin, stdout
#input = stdin.readline
#str_in = input()
# = len(str_in)
#b = [int(n) for n in str_in.split()]
#b = list(map(int, input().split()))
#n = int(input())
#b = [int(input()) for _ in range(n)]
b = [int(x) for x in input().split()]
n = b[0]
b = b[1:]
#print(b)
a = b
vis = [0]*100010
#转换成数组处理
#n = int(a[0])
flag = int(0)
for i in range(0, n):
try:
vis[a[i]] += 1
except:
vis[a[i]] = 1
for i in range(0, n):
if vis[a[i]] == 1:
flag = 1
print(a[i])
break
if flag == 0:
print("None")