Day 7

每日一题

在这里插入图片描述

题目

题目描述:
世界最古老的树是一棵瑞典的云衫树 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:

  1. 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:

  1. #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:

  1. <unordered_map> 是 C++ STL(标准模板库)中的一个头文件,用于实现一个哈希表容器 unordered_map。它提供了一种快速的查找方法,可以将一个键值对应到一个值上,并支持 O(1) 时间复杂度的插入、查找、删除操作。

    使用 unordered_map 可以实现类似于 C 中使用数组下标的功能,但它更加灵活,可以使用更加复杂的类型作为键,例如字符串、结构体等等。此外,unordered_map 还可以自定义哈希函数和比较函数,从而更好地适应不同的需求。

  2. unordered_map 是 C++ STL 标准库中提供的关联容器(Associative Containers)之一,可以用来快速地查找和插入数据,类似于 Java 中的 Map 或 Python 中的 dict。unordered_map 使用哈希表(hash table)实现,因此查找和插入的时间复杂度通常为 O(1)。

  3. 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:

  1. 在 Python 中,cnt = {} 表示创建了一个空的字典 cnt,可以用来存储键值对。字典是一种无序的数据类型,由一系列键值对组成,每个键值对之间用逗号 , 分隔,键和值之间用冒号 : 分隔,整个字典用花括号 {} 括起来。

    例如,{‘apple’: 2, ‘banana’: 3, ‘orange’: 1} 就是一个字典,其中 ‘apple’、‘banana’ 和 ‘orange’ 是键,对应的值分别为 2、3 和 1。我们可以通过 cnt[key] 来获取键 key 对应的值,也可以通过 cnt[key] = value 来给键 key 赋值为 value。

  2. 在 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:

在这里插入图片描述

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值