统计数字
本题来源:牛客网
题目链接:https://ac.nowcoder.com/acm/problem/16643
难度星级:2星
主要考察:排序、字典
这是一道简单(相对于部分语言来说)的排序的题目,先来看题
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
某次科研调查时得到了n个自然数,每个数均不超过1500000000( 1.5 ∗ 1 0 9 1.5*10^9 1.5∗109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
输入描述:
第1行是整数n,表示自然数的个数。
第2~n+1行每行一个自然数。
输出描述:
输出m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
示例1
输入
8
2
4
2
4
5
100
2
100
输出
2 3
4 2
5 1
100 2
备注:
40%的数据满足:1 ≤ n ≤ 1000
80%的数据满足:1 ≤ n ≤ 50000
100%的数据满足:1 ≤ n ≤ 200000,每个数均不超过1500000000( 1.5 ∗ 1 0 9 1.5*10^9 1.5∗109)
题目分析
这道题要考虑的有两个点,一是统计输入的所有自然数,二是输出的时候要按照数字大小升序输出。
考虑到这两点,我决定用python来AC这道题。
具体解决
分别解决这两个点
统计输入的所有自然数
这个很简单,只要开一个字典,将数字作为键,次数作为值就好了
number = {}
for i in range(n):
x = int(input())
if x in number.keys():
number[x] += 1
else:
number[x] = 1
输出的时候要按照数字大小升序输出
我这里用的方法是把所有的键存入一个列表中,再将列表排序,由于python列表有排序用的sort()
方法,所以直接调用就好了,如果是其他语言的话,就这给的时间限制,我估计无论用什么排序应该也都不会超时吧。当然肯定也不止这种方法,随意发挥就好。排序完后依次输出就好了。
key = list(number.keys())
key.sort()
for i in key:
print("{} {}".format(i, number[i]))
实现代码(python3.9)
n = int(input())
number = {}
for i in range(n):
x = int(input())
if x in number.keys():
number[x] += 1
else:
number[x] = 1
key = list(number.keys())
key.sort()
for i in key:
print("{} {}".format(i, number[i]))
提交结果
over!
能力有限,如有错误之处,敬请指正!