【蓝桥】统计字数

题目

题目描述

某次科研调查时得到了 n 个自然数,每个数均不超过 (1.5×10^9)。已知不相同的数不超过 10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。

输入描述

第 1 行是整数 n,表示自然数的个数。

第 2∼n 行每行一个自然数。

其中,1≤n≤2×10^5,每个数均不超过 1.5≤10^9,每个数均不超过1.5≤10^9。

输出描述

输出 m 行( m 为 n 个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。

输入输出样例

示例

输入

1
2
3
4
5
6
7
8
9
8
2
4
2
4
5
100
2
100

输出

1
2
3
4
2 3
4 2
5 1
100 2

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

解题

源码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int num = 0;
int a[200000];
cin >> num;
for (int i = 0; i < num; i++)
cin >> a[i];
sort(a, a + num);
int count = 0;
for (int i = 0; i < num; i++)
{
count++;
if (a[i] != a[i + 1])
{
cout << a[i] << " " << count << endl;
count = 0;
}
}
return 0;
}

Python

C++方法重铸版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from itertools import *

n=int(input())
lst=list()

for i in range(n):
lst.append(int(input()))
lst.sort()
lst.append("end")
a=0
for i in range(n):
a=a+1
if(lst[i]!=lst[i+1]):
print(lst[i],a)
a=0

python正统方法

1
2
3
4
5
6
7
8
9
10
11
12
n = int(input())
nums = {}
for i in range(n):
x = int(input())
if x in nums.keys():
nums[x] += 1
else:
nums[x] = 1
key = list(nums.keys())
key.sort()
for k in key:
print(k, nums[k])

总结

C++版

  1. 输入的数字太大了,没法用数组下标表示,难受
  2. 排序后循环计数输出

Python版

  1. 先利用元组的随机访问特性进行统计,然后把元组转换成list,输出即可