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%内容,订阅专栏后可继续查看/也可单篇购买

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

全部评论

相关推荐

在笔试的大西瓜很矫健:校招数分不用想了,这经历和学历都不够用,大厂更别想,初筛都过不了,说点不好听的小厂数分都进不去(小厂也是假数分),要两个对口实习+3个项目(或者3+2),而且要有含金量才能补一点你的学历劣势。 建议刷实习,社招找数分,校招看运气,能入行业就行,可以运营转数分
点赞 评论 收藏
分享
评论
4
8
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4419次浏览 78人参与
# 找AI工作可以去哪些公司? #
9751次浏览 287人参与
# 米连集团26产品管培生项目 #
13451次浏览 285人参与
# 你的实习产出是真实的还是包装的? #
20593次浏览 343人参与
# 从事AI岗需要掌握哪些技术栈? #
9562次浏览 360人参与
# 春招至今,你的战绩如何? #
67207次浏览 592人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15591次浏览 225人参与
# AI面会问哪些问题? #
28768次浏览 606人参与
# 中国电信笔试 #
32207次浏览 295人参与
# 你做过最难的笔试是哪家公司 #
35185次浏览 288人参与
# 金三银四,你的春招进行到哪个阶段了? #
22472次浏览 284人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
341130次浏览 2175人参与
# 如何准备秋招 #
78321次浏览 868人参与
# 同bg的你秋招战况如何? #
212262次浏览 1121人参与
# 哪些公司真双非友好? #
69778次浏览 289人参与
# 应届生被毁约被毁意向了怎么办 #
63331次浏览 305人参与
# 阿里笔试 #
179261次浏览 1321人参与
# 机械人避雷的岗位/公司 #
62720次浏览 393人参与
# 小马智行求职进展汇总 #
25149次浏览 80人参与
# 第一份工作一定要去大厂吗 #
15079次浏览 123人参与
# 担心入职之后被发现很菜怎么办 #
291415次浏览 1210人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26313次浏览 310人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务