1. 问题描述:
给定一个长度为 n 的整数数组 a1,a2,…,an。请你找到数组中只出现过一次的数当中最小的那个数。输出找到的数的索引编号。a1 的索引编号为 1,a2 的索引编号为 2,…,an 的索引编号为 n。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。每组数据第一行包含整数 n。第二行包含 n 个整数 a1,a2,…,an。
输出格式
每组数据输出一行结果,即满足条件的数的索引编号,如果不存在满足条件的数,则输出 −1。
数据范围
1 ≤ T ≤ 2 × 10 ^ 4,
1 ≤ n ≤ 2 × 10 ^ 5,
1 ≤ ai ≤ n,
同一测试点内的所有 n 的和不超过 2 × 10 ^ 5。
输入样例:
6
2
1 1
3
2 1 3
4
2 2 2 3
1
1
5
2 3 2 4 2
6
1 1 5 5 4 4
输出样例:
-1
2
4
1
2
-1
来源:https://www.acwing.com/problem/content/3764/
2. 思路分析:
分析题目可以知道我们需要找到当前n个数中只出现过一次的最小的那个数字,存在则输出那个数字对应的索引编号不存在则输出-1,可以使用哈希表来统计每一个数字出现的次数。
3. 代码如下:
字典:
class Solution:
def process(self):
T = int(input())
for i in range(T):
n = int(input())
mp = dict()
INF = 10 ** 6
res = INF
a = list(map(int, input().split()))
for j in range(n):
if a[j] not in mp:
# 注意索引编号从1开始所以为j + 1
mp[a[j]] = j + 1
else:
# 因为出现了两次所以需要标记为-1表示出现了大于了一次
mp[a[j]] = -1
t = INF
for k, v in mp.items():
# 只有当v != -1时才说明只出现过一次
if v != -1 and t > k:
# 更新答案和当前只出现一次的最小值
res = v
t = k
# 判断是否不存在这样的数字如果不存在输出-1
print(res if res != INF else -1)
if __name__ == '__main__':
Solution().process()
列表模拟哈希表但是由于python每一次声明比较大的列表的时候耗时都是比较久的所以超时了:
class Solution:
def process(self):
T = int(input())
N = 200010
for i in range(T):
n = int(input())
# mp相当于是哈希表
mp = [0] * N
a = list(map(int, input().split()))
for j in range(n):
# 对每一个出现的数字进行计数
mp[a[j]] += 1
res = -1
for j in range(n):
if mp[a[j]] == 1:
if res == -1 or a[res] > a[j]:
res = j
if res != -1:
# 索引编号是从1开始的
res += 1
print(res)
if __name__ == "__main__":
Solution().process()