【秋招笔试】10.12团子(已改编)秋招-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试

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

✨ 本系列打算持续跟新 春秋招笔试题

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

✨ 笔试合集传送们 -> 🧷春秋招笔试合集

🍒 本专栏已收集 140+ 套笔试题,笔试真题 会在第一时间跟新

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

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

alt

🌈 团子收官秋招最后一场笔试,来啦!!!

🧸 本次前两题难度不大,最后一题是一道二分图最大权匹配模版题,对于刚接触的宝子们会比较困难

1️⃣ 字符串模拟,比较简单

2️⃣ 自定义排序+字符串处理,难度不到

3️⃣ 二分图最大权匹配模版题,有一定的难度

🧋 01.珍珠奶茶的秘密配方 评测链接🔗

问题描述

K小姐是一家珍珠奶茶店的老板。她有一个秘密配方列表,列表中包含 种配料。每种配料都有一个独特的编号。K小姐认为一种配料是"完美配料",需要满足以下两个条件:

  1. 该配料编号的所有数位之和是一个偶数。
  2. 该配料编号中至少包含一个奇数数字。

现在,K小姐想知道她的秘密配方列表中有多少种"完美配料"。你能帮她计算一下吗?

输入格式

第一行输入一个整数 ),表示秘密配方列表中配料的数量。

第二行输入 个整数 ),表示每种配料的编号。

输出格式

输出一个整数,表示秘密配方列表中"完美配料"的数量。

样例输入1

3
13 14 15

样例输出1

2

样例输入2

5
11 22 33 44 55

样例输出2

3

样例解释

样例 解释说明
样例1 13和15是"完美配料"。13的数位和为1+3=4(偶数),且包含奇数;15的数位和为1+5=6(偶数),且包含奇数。14不是"完美配料",因为它不包含奇数。
样例2 11、33和55是"完美配料"。它们的数位和都是偶数(2、6和10),且都包含奇数。22和44不是"完美配料",因为它们不包含奇数。

数据范围

题解

模拟+枚举

对于每个输入的数字,需要做两件事:

  • 计算数位之和
  • 检查是否包含奇数数字

可以通过以下步骤来检查每个数字:

  • 使用循环,每次取出数字的最后一位(对10取余)
  • 将这一位加到数位之和中
  • 检查这一位是否为奇数
  • 将原数字除以10,继续处理下一位

在循环结束后,检查:

  • 数位之和是否为偶数
  • 是否找到了至少一个奇数数字
  1. 如果同时满足这两个条件,将计数器加1

  2. 最后,输出计数器的值,即为"完美配料"的数量

参考代码

  • Python
# 读取输入
n = int(input())  # 读取配料数量
ingredients = list(map(int, input().split()))  # 读取每种配料的编号

def is_perfect(num):
    digit_sum = 0  # 初始化数位和
    has_odd = False  # 标记是否包含奇数
    
    while num > 0:
        digit = num % 10  # 获取最后一位数字
        digit_sum += digit  # 累加到数位和
        if digit % 2 == 1:  # 检查是否为奇数
            has_odd = True
        num //= 10  # 去掉最后一位
    
    # 返回是否为完美配料(数位和为偶数且包含奇数)
    return digit_sum % 2 == 0 and has_odd

# 计算完美配料的数量
perfect_count = sum(1 for ingredient in ingredients if is_perfect(ingredient))

# 输出结果
print(perfect_count)
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();  // 读取配料数量
        int perfectCount = 0;  // 初始化完美配料计数器

        for (int i = 0; i < n; i++) {
            int ingredient = scanner.nextInt();  // 读取每种配料的编号
            if (isPerfect(ingredient)) {
                perfectCount++;  // 如果是完美配料,计数器加1
            }
        }

        System.out.println(perfectCount);  // 输出结果
    }

    // 判断是否为完美配料
    private static boolean isPerfect(int num) {
        int digitSum = 0;  // 初始化数位和
        boolean hasOdd = false;  // 标记是否包含奇数

        while (num > 0) {
            int digit = num % 10;  // 获取最后一位数字
            digitSum += digit;  // 累加到数位和
            if (digit % 2 == 1) {  // 检查是否为奇数
                hasOdd = true;
            }
            num /= 10;  // 去掉最后一位
        }

        // 返回是否为完美配料(数位和为偶数且包含奇数)
        return digitSum % 2 == 0 && hasOdd;
    }
}
  • Cpp
#include <iostream>
#include <vector>

using namespace std;

// 判断是否为完美配料
bool isPerfect(int num) {
    int digitSum = 0;  // 初始化数位和
    bool hasOdd = false;  // 标记是否包含奇数
    
    while (num > 0) {
        int digit = num % 10;  // 获取最后一位数字
        digitSum += digit;  // 累加到数位和
        if (digit % 2 == 1) {  // 检查是否为奇数
            hasOdd = true;
        }
        num /= 10;  // 去掉最后一位
    }
    
    // 返回是否为完美配料(数位和为偶数且包含奇数)
    return (digitSum % 2 == 0) && hasOdd;
}

int main() {
    int n;
    cin >> n;  // 读取配料数量
    
    int perfectCount = 0;  // 初始化完美配料计数器
    for (int i = 0; i < n; i++) {
        int ingredient;
        cin >> ingredient;  // 读取每种配料的编号
        if (isPerfect(ingredient)) {
            perfectCount++;  // 如果是完美配料,计数器加1
        }
    }
    
    cout << perfectCount << endl;  // 输出结果
    return 0;
}

🎀 02.神秘密码解锁器 评测链接🔗

问题描述

LYA 是一名热爱解谜的高中生。最近,她收到了一个神秘的密码锁,上面刻着一串由小写字母和数字组成的混合字符串。解锁的关键是找出这串字符中隐藏的第 大数字。LYA 决定编写一个程序来解开这个密码锁。解锁规则如下:

  1. 混合字符串中的连续数字会被视为一个完整的非负整数。
  2. 将所有提取出的非负整数按照降序排列。
  3. 从排序后的数列中选择第 个数作为密码。
  4. 如果不存在第 个数,则密码锁无法打开。

你能帮助 LYA 编写一个程序,快速找出密码或确定密码锁无法打开吗?

输入格式

第一行输入一个正整数 ),表示需要找的是第 大的数。

第二行输入一个长度不超过 的字符串 ,由小写字母和数字混合构成。

输出格式

输出一行,如果存在第 大的数,则输出这个数(不包含前导 0);如果不存在,则输出字母 N。

样例输入1

3
a12b03c3d0

样例输出1

3

样例输入2

5
a12b03c3d0

样例输出2

N

样例解释

样例 解释说明
样例1 从字符串中提取出的非负整数按降序排列为:[12, 3, 3, 0],第 3 个数为 3。
样例2 从字符串中提取出的非负整数按降序排列为:[12, 3, 3, 0],不存在第 5 个数。

数据范围

  • 字符串 的长度不超过
  • 仅由小写英文字母和数字组成

题解

模拟+自定义排序

由于整数可能很大,本题需要用字符串模拟。

这道题目要求从一个混合字符串中提取数字,并找出第 k 大的数。解题思路如下:

  1. 遍历字符串,提取所有连续的数字序列。
  2. 将提取出的数字序列转换为整数,并存储在一个数组中。
  3. 对数组进行降序排序,序时使用自定义比较函数,先比较数字的位数,再比较数字的大小,这样可以正确处理大数的情况。。
  4. 如果数组长度小于 k,输出 "N";否则,输出第 k 个元素。

参考代码

  • Python
# 读取输入
k = int(input())
s = input()

# 提取数字
numbers = []
current_number = ''

for char in s:
    if char.isdigit():
        current_number += char
    elif current_number:
        # 去除前导零
        numbers.append(current_number.lstrip('0') or '0')
        current_number = ''

# 处理最后可能剩余的数字
if current_number:
    numbers.append(current_number.lstrip('0') or '0')

# 排序
numbers.sort(key=lambda x: (len(x), x), reverse=True)

# 输出结果
if k <= len(numbers):
    print(numbers[k-1])
else:
    print('N')
  • Java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int k = scanner.nextInt();
        String s = scanner.next();

        List<String> numbers = new ArrayList<>();
        StringBuilder currentNumber = new StringBuilder();

        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                currentNumber.append(c);
            } else if (currentNumber.length() > 0) {
                String number = removeLeadingZeros(currentNumber.toString());
                numbers.add(number);
                currentNumber = new StringBuilder();
            }
        }

        if (currentNumber.length() > 0) {
            String number = removeLeadingZeros(currentNumber.toString());
            numbers.add(number);
        }

        numbers.sort((a, b) -> {
            if (a.length() != b.length()) {
                return b.length() - a.length();
            }
            return b.compareTo(a);
        });

        if (k <= numbers.size()) {
            System.out.println(numbers.get(k - 1));
        } else {
            System.out.println("N");
        }
    }

    private static String removeLeadingZeros(String s) {
        int i = 0;
        while (i < s.length() - 1 && s.charAt(i) == '0') {
            i++;
        }
        return s.substring(i);
    }
}
  • Cpp
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    int k;
    string s;
    cin >> k >> s;

    vector<string> nums;
    string curr = "";

    // 提取数字
    for (char c : s) {
        if (isdigit(c)) {
            curr += c;
        } else if (!curr.empty()) {
            // 去除前导零
            int idx = curr.find_first_not_of('0');
            nums.push_back(idx != string::npos ? curr.substr(idx) : "0");
            curr.clear();
        }
    }

    // 处理最后可能剩余的数字
    if (!curr.empty()) {
        int idx = curr.find_first_no

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

学长刷题笔记 文章被收录于专栏

这里收集了超全的刷题笔记,欢迎大家的订阅,会持续跟新的

全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务