10.13PDD(已改编)-三语言题解

💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历

👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸

✨ 笔试合集传送们 -> 🧷学长刷题笔记

🍄 题面描述等均已改编,如果试题题面描述不一样请理解,做法和题目本质基本不变。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力 💞

alt

1️⃣ 经典老题了,统计 2 和 5 的数量,取最小的那个

2️⃣ 字符串模拟题,难度不大

3️⃣ 贪心,由于每个值不相等,排序后对于能分的分,计算最小分割次数,最后和k做比较

4️⃣ 树形DP,观察到题目描述,其实本质上是颗树,求树上直径的问题

🍬 01.神秘的糖果盒 评测链接🔗

题目描述

K小姐是一位热爱收集糖果的甜点爱好者。她有一个神奇的糖果盒,里面装满了各种各样的糖果。每颗糖果都有一个特殊的数值,代表着它的甜度。K小姐想知道,如果她把所有糖果的甜度乘起来,最终结果的末尾会有多少个0。这个数字恰好就是她今天可以吃到的糖果数量。你能帮助K小姐计算出这个数字吗?

输入格式

第一行输入一个正整数 ),表示糖果盒中糖果的数量。

第二行输入 个正整数 ),两两之间用空格隔开,表示每颗糖果的甜度值。

输出格式

输出一个整数 ,表示所有糖果甜度值之和的末尾0的个数。

样例输入1

1
10

样例输出1

1

样例输入2

3
25 8 10

样例输出2

3

数据范围

题解

数学

需要理解末尾0的形成原理。在十进制系统中,末尾的0是由10的因子产生的,而10可以分解为2和5的乘积。因此,我们的任务就转化为计算所有数字中2和5的因子的数量。

末尾0的个数取决于2和5因子中数量较少的那个,为什么呢?

  • 因为每一对2和5才能产生一个10,从而在结果末尾产生一个0。

解题步骤:

  1. 遍历所有输入的数字。
  2. 对每个数字,统计它包含的2和5的因子数量。
  3. 累加所有数字的2和5的因子数量。
  4. 取2和5因子数量的较小值,这就是最终结果末尾0的个数。

参考代码

  • Python
def count_factors(n, factor):
    """计算n中factor因子的数量"""
    count = 0
    while n % factor == 0:
        n //= factor
        count += 1
    return count

def solve():
    n = int(input())  # 读取糖果数量
    candies = list(map(int, input().split()))  # 读取每颗糖果的甜度值
    
    count_2 = 0  # 2因子的总数
    count_5 = 0  # 5因子的总数
    
    for candy in candies:
        count_2 += count_factors(candy, 2)
        count_5 += count_factors(candy, 5)
    
    # 末尾0的个数等于2和5因子中较少的那个
    print(min(count_2, count_5))

solve()
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();  // 读取糖果数量
        long count2 = 0, count5 = 0;  // 使用long类型防止溢出
        
        for (int i = 0; i < n; i++) {
            int candy = scanner.nextInt();
            count2 += countFactors(candy, 2);
            count5 += countFactors(candy, 5);
        }
        
        System.out.println(Math.min(count2, count5));
    }
    
    // 计算num中factor因子的数量
    private static int countFactors(int num, int factor) {
        int count = 0;
        while (num % factor == 0) {
            num /= factor;
            count++;
        }
        return count;
    }
}
  • Cpp
#include <iostream>
#include <algorithm>
using namespace std;

// 计算num中factor因子的数量
int countFactors(int num, int factor) {
    int count = 0;
    while (num % factor == 0) {
        num /= factor;
        count++;
    }
    return count;
}

int main() {
    int n;
    cin >> n;  // 读取糖果数量
    
    long long count2 = 0, count5 = 0;  // 使用long long防止溢出
    
    for (int i = 0; i < n; i++) {
        int candy;
        cin >> candy;
        count2 += countFactors(candy, 2);
        count5 += countFactors(candy, 5);
    }
    
    cout << min(count2, count5) << endl;
    
    return 0;
}

🪙 02.密码学家的挑战 评测链接🔗

问题描述

LYA 是一位年轻有为的密码学家。她最近接到了一个特殊的任务:破解一种新型的加密信息。经过长期研究,LYA 发现了这种加密方式的规律:

  1. 原始信息是一个由小写英文字母组成的多元字符串,即不包含重复字符的字符串。例如 "abc", "xyz", "apex", "blackmyth" 都是多元字符串,而 "goodgame", "connect" 则不是。

  2. 加密后的信息同样是一个多元字符串,它与原始信息存在严格的一一对应关系。假设原始信息为 ,加密信息为 是字典序上刚好大于 的下一个多元字符串。

LYA 将这个加密函数记为 ,例如: , ,

需要注意的是,不存在字典序大于 小于 的多元字符串 。如果不存在字典序大于 的下一个多元字符串,则 ,例如:

现在,LYA 收到了一批新的加密信息 ,她需要你的帮助来破解出原始信息 。你能协助 LYA 完成这个任务吗?

输入格式

第一行一个整数 ,表示测试用例的数量

对于每个测试用例: 一行输入字符串

输出格式

对于每个测试用例,输出一行,为对应的原始信息

样例输入1

5
abc
abz
azyxwvutsrqponmlkjihgfedcb
zyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwyx

样例输出1

abcd
abzc
b
zyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvx

样例解释

样例 解释说明
样例1 第一个测试用例 "abc",下一个多元字符串是 "abcd"。
第二个测试用例 "abz",下一个多元字符串是 "abzc"。
第三个测试用例 "azyxwvutsrqponmlkjihgfedcb",下一个多元字符串是 "b"。
第四个测试用例 "zyxwvutsrqponmlkjihgfedcba" 已经是最大的多元字符串,所以保持不变。
第五个测试用例 "abcdefghijklmnopqrstuvwyx",下一个多元字符串是 "abcdefghijklmnopqrstuvx"。

数据范围

  • 为一个多元字符串

题解

模拟题

检查是否可以直接在字符串末尾添加一个新字符

  • 如果可以是最简单的情况,只需要找到最小的未使用字符并添加到末尾即可。

  • 如果不能直接添加字符,就需要从字符串的末尾开始,找到第一个可以增大的位置。

    这个位置的特征是:它右边的字符都是按降序排列的。找到这个位置后,将这个位置的字符替换为比它大的最小字符,然后删除它右边的所有字符。

参考代码

  • Python
def solve(s):
    # 将字符串转换为字符列表,方便操作
    chars = list(s)
    n = len(chars)
    
    # 检查是否可以直接在末尾添加字符
    used = set(chars)
    for c in range(ord('a'), ord('z') + 1):
        if chr(c) not in used:
            return s + chr(c)
    
    # 从后向前查找可以增大的位置
    i = n - 2
    while i >= 0 and chars[i] >= chars[i + 1]:
        i -= 1
    
    # 如果找不到可以增大的位置,返回原字符串
    if i == -1:
        return s
    
    # 找到比chars[i]大的最小字符
    j = n - 1
    while chars[j] <= chars[i]:
        j -= 1
    
    # 交换chars[i]和chars[j]
    chars[i], chars[j] = chars[j], chars[i]
    
    # 删除i之后的所有字符
    return ''.join(chars[:i+1])

# 读取测试用例数量
T = int(input())

# 处理每个测试用例
for _ in range(T):
    s = input().strip()
    print(solve(s))
  • Java
import java.util.*;

public class Main {
    public static String solve(String s) {
        char[] chars = s.toCharArray();
        int n = chars.length;
        
        // 检查是否可以直接在末尾添加字符
        boolean[] used = new boolean[26];
        for (char c : chars) {
            used[c - 'a'] = true;
        }
        for (int i = 0; i < 26; i++) {
            if (!used[i]) {
                return s + (char)('a' + i);
            }
        }
        
        // 从后向前查找可以增大的位置
        int i = n - 2;
        while (i >= 0 && chars[i] >= chars[i + 1]) {
            i--;
        }
        
        // 如果找不到可以增大的位置,返回原字符串
        if (i == -1) {
            return s;
        }
        
        // 找到比chars[i]大的最小字符
        int j = n - 1;
        while (chars[j] <= chars[i]) {
            j--;
        }
        
        // 交换chars[i]和chars[j]
        char temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
        
        // 返回i之前的所有字符
        return new String(chars, 0, i + 1);
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符
        
        for (int t = 0; t < T; t++) {
            String s = scanner.nextLine();
            System.out.println(solve(s));
        }
    }
}
  • Cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;

string solve(string s) {
    vector<char> chars(s.begin(), s.end());
    int n = chars.size();
    
    // 检查是否可以直接在末尾添加字符
    vector<bool> used(26, false);
    for (char c : chars) {
        used[c - 'a'] = true;
    }
    for (int i = 0; i < 26; i++) {
        if (!used[i]) {
            return s + char('a' + i);
        }
    }
    
    // 从后向前查找可以增大的位置
    int i = n - 2;
    while (

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏短期内不再更新,请勿继续订阅

全部评论

相关推荐

我曾经以为实习第一天离职,听上去很不可思议,甚至像是小说中的剧情,但是这种事情真的发生在了我身上。在5月23日,我参加了一个中小厂的面试,一面非常的顺利,大部分问题我都成功回答出来了,到了后面反问环节,还知道了面试官居然是我的学长,这让我非常亲切。当天hr就约我进行二面了,我当时感觉自己好幸运,好幸福。hr给我说二面的面试官可能会比较严厉,但是私下人很好(划重点!)时间来到了5月25日,我二面的日子,我家住重庆主城的南边,公司在北边,我单程的通勤时间是2h左右。二面很艰难,比一面难了许多,全是上一段实习的项目拷打和场景题,我当时压力很大,感觉很不适(可能是我没有被这么压力面过),但是我没有觉得面试官有什么问题,或者这个方式有什么不妥,我只是觉得自己还很菜,对于这方面的准备还需要加强。然后就在这样的煎熬中,我度过了二面。hr姐姐是个很好的人,她一直在帮我跟进二面的进度,也一直在给我反馈,在5月26日晚,hr给我说二面过了,让我准备学信网在线认证的资料等,我当时觉得那是我人生中最快乐的几个瞬间之一。5月26日到6月4日,可能是我大学生涯中过得最像一个普通的二本男大学生的日子:天天睡到自然醒,到了实验室就躺着玩手机,玩累了就晚电脑,然后隔三岔五就出去吃顿好的(当然,没有说这样的生活不好的意思),然后就到了今天,6月5日,我入职——和我离职的日子。6月5日,早上5:55,重庆很多高中走读生起床的时间,我也起床了,因为通勤需要两个小时,加上是入职的日子,我决定早点到公司。重庆的直快列车,早上是没有位置的,我背着我的游戏本站了一个多小时,加上步行1.5km,终于在8:27分到了公司大厅,然后在9:00过,被一个同事带到了工位上,工位左边的就是我的学长,右边的是一个大四的同事。由于我们的项目是银行的内网开发,需要安装一系列银行内网的软件和配置一系列的环境。两个同事都非常热心的一直在帮助我,终于在十点过,配置到了最后一步,安装银行的一个什么安全助手,安装后就出问题了:“我的conda被列为了高危软件,需要立即卸载”(虽然我不知道为什么conda是高危软件),但是我conda配置了很多虚拟环境,我不是很想删除。于是我和几个同事商量了之后,我决定使用公司电脑进行环境配置。但是现在有个严重的问题:“因为我的conda被列为了高危软件,导致银行的安全助手把我的网断了”(我不知道是什么原理,可以让我无法上网,请原谅我的垃圾计网),更逆天的是,这个安全助手一旦安装则无法卸载,并且永久启动。此时我的想法是&quot;我反正向公司申请了电脑,那得先把我的电脑搞好,把conda卸载了,先有网了再说。&quot;然后我就开始卸载conda,因为我的环境什么的很多,conda卸载得很慢,此时,二面面试官——也就是我们的项目经理,也就是这个故事的男二号他来了,他一进门就对着我说“你一天没得事干得迈?怎么坐起在耍哎?”我当时就懵了,我在等待conda卸载,此时我的电脑是没有网的,我什么也干不了,我只能盯着屏幕上面的进度条,不然我还可以耍手机。但是处于礼貌和下属的身份,我还是用认错的口吻回了一个“有事做,有事做”。本以为风波就会过去,但是我卸载conda后,软件依旧在报错,我的电脑依旧没有网。此时我的两个“同桌”仍然不厌其烦的帮我想办法解决,我的目光也就在他们两个的电脑上面来回跳动,这个时候,他又开始发狂了:“xx(我学长的名字),你没有给他安排任务吗?我感觉他一直没得事做得哎,你把下周要做的给他安排起啊!”,此时我已经有些厌烦,就没有理他,而我的学长非常耐心的给他解释了今天早上发生了什么事情和为什么我看起来无所事事。(真的感谢学长)但是搞了很久,还是没有解决这个问题,我们都有些无语了,特别是我,看到电脑被一个“流氓软件”搞得上不了网,就好像影视作品中无能的丈夫一样无力,我十分烦躁,此时,他点燃了我:“xxx(我的大名),下次就不可能让你因为自己的原因,上班来搞这些了哈,搞不好自己加班给我搞!”我当时就发火了,原因有两点:1、这根本不是我的问题啊,我怎么知道电脑里面有些看起来很日常的软件和内网的软件不兼容;2、我明明一直在解决问题,他什么都不知道但是却一直说我,还指着我说这些都来了。然后我就怼了回去,怼了他几句,他就说不出话了——“可能是不想和我计较吧,大概!”。中午吃饭的时候,整个项目组都很震惊,好像我是第一个怼他的,然后大家在一起吃饭的时候都在骂他,说他让整个团队变得非常压抑,他非常不讲道理,他就是这种人什么的。大家都在安慰我(这里非常感谢大家),但是我已经决定今天就离职!到了下班时间,气氛非常的微妙,大家都归心似箭,但是却无一人起身,这是为什么?——因为他要加班!是的,就是因为他要加班,没有一个人敢走!但是我已决心离职,于是收好东西之后,郑重的和我的学长还有旁边的同事告别后,扬长而去。到了地铁站我就给hr提出离职,hr主动和我打电话了解了情况,并且耐心的安慰我(这里非常感谢hr姐姐,如果她可以看到的话,衷心表示感谢);学长也给我发消息安慰我,让我冷静一下。现在,也已经深了,我相当的冷静,我还是决定离职,我不知道这是否是一个好的选择,至少在当下,大三的我觉得这是一个必要的,正确的选择!我也相当的后悔,我只是怼回去了,而我并没有骂他,相当的后悔!最后,再次衷心感谢hr姐姐、我的学长、我的同桌、和项目组中帮助过我的每一个人。(给大家一个面子,也不给大家找麻烦,我决定不曝光公司名和他的名字)
大三一定要找到实习:后悔啥呀,通勤2h➕第一天被疯狂压力➕加班,这日子后面会很难受
实习生的蛐蛐区
点赞 评论 收藏
分享
评论
4
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务