【秋招笔试】10.12团子(已改编)秋招-三语言题解
🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试
💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历
✨ 本系列打算持续跟新
春秋招笔试题
👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸
✨ 笔试合集传送们 -> 🧷春秋招笔试合集
🍒 本专栏已收集
140+
套笔试题,笔试真题
会在第一时间跟新🍄 题面描述等均已改编,如果和你笔试题看到的题面描述不一样请理解,做法和题目本质基本不变。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力 💞
🌈 团子收官秋招最后一场笔试,来啦!!!
🧸 本次前两题难度不大,最后一题是一道二分图最大权匹配模版题,对于刚接触的宝子们会比较困难
1️⃣ 字符串模拟,比较简单
2️⃣ 自定义排序+字符串处理,难度不到
3️⃣ 二分图最大权匹配模版题,有一定的难度
🧋 01.珍珠奶茶的秘密配方 评测链接🔗
问题描述
K小姐是一家珍珠奶茶店的老板。她有一个秘密配方列表,列表中包含 种配料。每种配料都有一个独特的编号。K小姐认为一种配料是"完美配料",需要满足以下两个条件:
- 该配料编号的所有数位之和是一个偶数。
- 该配料编号中至少包含一个奇数数字。
现在,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
-
最后,输出计数器的值,即为"完美配料"的数量
参考代码
- 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 决定编写一个程序来解开这个密码锁。解锁规则如下:
- 混合字符串中的连续数字会被视为一个完整的非负整数。
- 将所有提取出的非负整数按照降序排列。
- 从排序后的数列中选择第 个数作为密码。
- 如果不存在第 个数,则密码锁无法打开。
你能帮助 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 大的数。解题思路如下:
- 遍历字符串,提取所有连续的数字序列。
- 将提取出的数字序列转换为整数,并存储在一个数组中。
- 对数组进行降序排序,序时使用自定义比较函数,先比较数字的位数,再比较数字的大小,这样可以正确处理大数的情况。。
- 如果数组长度小于 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%内容,订阅专栏后可继续查看/也可单篇购买
这里收集了超全的刷题笔记,欢迎大家的订阅,会持续跟新的