每日一题
题目
题目描述:
世界最古老的树是一棵瑞典的云衫树 OldTjikko,高 4.8 米。 2004 年发现以后,经过碳 14 测定,年龄达到 9500 岁
具有争议的是,只有树根是 9500 岁,树干是后来长出来的,只有几百年历史。即使树干死亡,这种树的根系仍活着,能够重新生成新的树干。树干的生命大约是 600 年左右,当大雪将树干压倒,推入地面后,树枝随后在地下生根,从旧根中萌芽新根。
这一天,勇者在盘点这棵树附近树木的年龄,并且记录了每棵树的年龄(保证是正整数),请问树龄为多少的树木是最多的?如果答案不止一个,请输出最小那个。
输入输出格式
输入格式
一个 n(0<n≤1000) ,代表盘点的树的数目, 接下来 n 个数字 y ,代表每棵树的年龄( 0<y≤9500 , y 是整数)。同一行数字之间用空格隔开。
输出格式
一个整数 ans 。
输入输出样例
输入
10
8 72 12 234 5 6 3 9 9 8
输出
8
Java写法:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Map<Integer, Integer> map = new HashMap<>(); // 哈希表统计每个树龄出现的次数
int maxCount = 0; // 出现次数最多的树龄的出现次数
int minAge = Integer.MAX_VALUE; // 出现次数最多的树龄中最小的树龄
for (int i = 0; i < n; i++) {
int age = sc.nextInt();
if (age <= 0 || age > 9500) { // 树龄不在规定范围内,直接跳过
continue;
}
int count = map.getOrDefault(age, 0) + 1; // 获取当前树龄的出现次数,并加1
map.put(age, count); // 更新哈希表
if (count > maxCount) { // 如果当前树龄的出现次数超过了历史最大值
maxCount = count; // 更新历史最大值
minAge = age; // 当前树龄成为出现次数最多的树龄,更新最小树龄
} else if (count == maxCount && age < minAge) { // 如果当前树龄的出现次数和历史最大值相同,且当前树龄更小
minAge = age; // 更新最小树龄
}
}
System.out.println(minAge); // 输出最小树龄
}
}
Tips:
-
map.getOrDefault(age, 0) 的作用是获取哈希表 map 中以 age 为键的值,如果 age 不存在于哈希表中,则返回默认值 0。
因此 map.getOrDefault(age, 0) + 1 的意思是:如果哈希表中已经有了 age 这个键,则获取它对应的值并加上 1;如果哈希表中没有 age 这个键,则返回默认值 0 并加上 1,得到 1。
这个操作的目的是统计每个树龄出现的次数,具体地,每次读入一个树龄时,我们先从哈希表 map 中获取当前树龄已经出现的次数,然后将次数加 1,最后将更新后的次数存回哈希表中。
C写法:
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 1000
int main() {
int n, age, max_age = 0, max_cnt = 0, cnt[MAX_N + 1] = {0};
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &age);
++cnt[age];
if (cnt[age] > max_cnt || (cnt[age] == max_cnt && age < max_age)) {
max_age = age;
max_cnt = cnt[age];
}
}
printf("%d\n", max_age);
return 0;
}
Tips:
- #define MAX_N 1000 定义了一个宏常量,即将代码中所有出现 MAX_N 的地方都替换成 1000。
C++写法:
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
int n, age, max_age = 0, max_cnt = 0;
unordered_map<int, int> cnt;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> age;
++cnt[age];
if (cnt[age] > max_cnt || (cnt[age] == max_cnt && age < max_age)) {
max_age = age;
max_cnt = cnt[age];
}
}
cout << max_age << endl;
return 0;
}
Tips:
-
<unordered_map> 是 C++ STL(标准模板库)中的一个头文件,用于实现一个哈希表容器 unordered_map。它提供了一种快速的查找方法,可以将一个键值对应到一个值上,并支持 O(1) 时间复杂度的插入、查找、删除操作。
使用 unordered_map 可以实现类似于 C 中使用数组下标的功能,但它更加灵活,可以使用更加复杂的类型作为键,例如字符串、结构体等等。此外,unordered_map 还可以自定义哈希函数和比较函数,从而更好地适应不同的需求。
-
unordered_map 是 C++ STL 标准库中提供的关联容器(Associative Containers)之一,可以用来快速地查找和插入数据,类似于 Java 中的 Map 或 Python 中的 dict。unordered_map 使用哈希表(hash table)实现,因此查找和插入的时间复杂度通常为 O(1)。
-
C语言中也有类似于 C++ 中 unordered_map 的结构,它叫做哈希表(hash table)。哈希表是通过把键(key)通过哈希函数(hash function)转换成一个整数索引,然后通过该索引来访问数组中的元素,从而实现对键值对的快速查找、插入和删除。
C语言标准库中没有提供哈希表的实现,但是你可以使用开源的第三方库,比如 Google 的开源哈希表实现 Google sparsehash 或 Facebook 的开源哈希表实现 Folly 的 fbstring。
如果想要使用类似C++ STL中的map或unordered_map的功能,可以在C语言中自己实现一个哈希表或红黑树等数据结构来实现。不过相比C++中STL中提供的实现,自己实现需要更多的代码量和调试时间。
Python写法:
n = int(input())
cnt = {}
max_age = 0
max_cnt = 0
for i in range(n):
age = int(input())
cnt[age] = cnt.get(age, 0) + 1
if cnt[age] > max_cnt or (cnt[age] == max_cnt and age < max_age):
max_age = age
max_cnt = cnt[age]
print(max_age)
Tips:
-
在 Python 中,cnt = {} 表示创建了一个空的字典 cnt,可以用来存储键值对。字典是一种无序的数据类型,由一系列键值对组成,每个键值对之间用逗号 , 分隔,键和值之间用冒号 : 分隔,整个字典用花括号 {} 括起来。
例如,{‘apple’: 2, ‘banana’: 3, ‘orange’: 1} 就是一个字典,其中 ‘apple’、‘banana’ 和 ‘orange’ 是键,对应的值分别为 2、3 和 1。我们可以通过 cnt[key] 来获取键 key 对应的值,也可以通过 cnt[key] = value 来给键 key 赋值为 value。
-
在 Python 中,字典(Dictionary)是一种无序的、可变的数据类型,它是由一组键和值组成的。字典中的键和值都可以是任意数据类型,不同于列表和元组等有序的序列,字典是通过键(Key)来访问元素的。
字典的特点:
1.字典中的元素是无序的。
2.字典中的键必须是不可变类型,如字符串、数字或元组。
3.字典中的值可以是任意类型。
4.字典中的键必须是唯一的,如果有重复的键,则后面的键会覆盖前面的键。
5.字典是可变的,即可以增加、删除和修改元素。
字典常用的操作:
1.创建字典
创建字典可以通过以下方式:
bash
Copy code
创建一个空字典
d = {}
创建一个有键值对的字典
d = {‘name’: ‘Tom’, ‘age’: 18, ‘gender’: ‘male’}
2.访问字典
字典中的元素可以通过键来访问,语法如下:
d[key]
其中,key 表示要访问的键。如果键存在,则返回对应的值;如果键不存在,则会抛出 KeyError 异常。
还可以使用 get() 方法来访问字典,语法如下:
d.get(key, default)
其中,key 表示要访问的键,default 表示如果键不存在时返回的默认值。如果键存在,则返回对应的值;如果键不存在,则返回默认值。
3.修改字典
可以通过以下方式修改字典中的元素:
修改已存在的键的值
d[key] = value
添加新的键值对
d[new_key] = new_value
4.删除字典元素
可以使用 del 关键字或 pop() 方法来删除字典中的元素,语法如下:
删除指定键的元素
del d[key]
删除字典中的所有元素
d.clear()
删除并返回指定键的值,如果键不存在,则返回默认值
d.pop(key, default)
5.字典的遍历
可以通过循环遍历字典中的键、值或键值对,语法如下:
遍历字典中的键
for key in d:
print(key)
遍历字典中的值
for value in d.values():
print(value)
遍历字典中的键值对
for key, value in d.items():
print(key, value)
这些是字典常用的操作,还有其他的操作可以根据实际需要来使用。
PHP写法:
<?php
$n = intval(fgets(STDIN));
$cnt = array();
$max_age = 0;
$max_cnt = 0;
for ($i = 0; $i < $n; ++$i) {
$age = intval(fgets(STDIN));
if (!array_key_exists($age, $cnt)) {
$cnt[$age] = 0;
}
++$cnt[$age];
if ($cnt[$age] > $max_cnt || ($cnt[$age] == $max_cnt && $age < $max_age)) {
$max_age = $age;
$max_cnt = $cnt[$age];
}
}
echo $max_age . "\n";
?>
Tips: