【秋招笔试】24-07-27-科大讯飞提前批-研发岗笔试题
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员
💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导
✨ 本系列打算持续跟新 秋招笔试题
👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸
总结
本次的笔试难度跨度较大,前两题比较简单,最后一题需要 前缀和优化DP 解决,其中 Python
和 Java
在笔试中据说会超时(Cpp
选手狂喜)
😒 01.心情管理大师
问题描述
K小姐是一名心理咨询师,她最近在研究人们的心情变化规律。她发现,当一个人连续工作时,每天的心情指数会下降 点;而当这个人休息一天时,心情指数会上升1点。
K小姐想要帮助她的客户A先生进行心情管理。A先生目前的心情指数为0,他计划先连续工作 天,然后开始休假。K小姐想知道,从A先生开始工作到他的心情指数再次回到0,总共需要多少天。
请你帮助K小姐编写一个程序,计算出这个天数。
输入格式
第一行给出测试用例的数量 。
随后 行,每行给出 和 的值,用空格分隔。
输出格式
输出 行,每行一个整数,表示对应测试用例的答案。
样例输入
2
2 3
3 1
样例输出
9
4
数据范围
题解
-
计算 天工作后的心情指数变化:。
-
计算需要多少天休息才能让心情指数回到0:。
-
3总天数就是工作天数加上休息天数:。
因此,我们可以直接用公式 计算出结果。
参考代码
- Python
def solve():
# 读取输入的 a 和 b 值
a, b = map(int, input().split())
# 计算并输出结果
print(b * (a + 1))
# 读取测试用例数量
t = int(input())
# 循环处理每个测试用例
for _ in range(t):
solve()
- Java
import java.util.Scanner;
public class Main {
public static void solve(Scanner sc) {
// 读取输入的 a 和 b 值
int a = sc.nextInt();
int b = sc.nextInt();
// 计算并输出结果
System.out.println(b * (a + 1));
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读取测试用例数量
int t = sc.nextInt();
// 循环处理每个测试用例
while (t-- > 0) {
solve(sc);
}
sc.close();
}
}
- Cpp
#include <iostream>
using namespace std;
void solve() {
int a, b;
// 读取输入的 a 和 b 值
cin >> a >> b;
// 计算并输出结果
cout << b * (a + 1) << endl;
}
int main() {
int t;
// 读取测试用例数量
cin >> t;
// 循环处理每个测试用例
while (t--) {
solve();
}
return 0;
}
📝 02.密码学家的挑战
问题描述
K小姐是一位密码学家,她最近在研究一种特殊的加密方法。这种方法将一个十进制数转换为不同进制(2 到 36 进制)的表示,其中 A 表示 10,B 表示 11,以此类推,Z 表示 35。
K小姐发现,某些数字在特定进制下的表示中只包含一个数字 1。她想知道,对于给定的十进制数 ,在所有 2 到 36 进制的表示中,最多可以包含多少个数字 1。
请你帮助 K小姐编写一个程序,计算出这个最大值。
输入格式
输入一行,包含一个整数 (),表示给定的十进制数。
输出格式
输出一行,包含一个整数,表示在 2 到 36 进制的所有表示中,数字 1 出现次数的最大值。
样例输入
4
样例输出
2
样例说明
当 时,在 3 进制下表示为 ,包含两个 1,这是最多的情况。
数据范围
题解
-
对于给定的十进制数 ,遍历 2 到 36 的所有进制。
-
对于每种进制,将 转换为该进制的表示,并统计其中 1 的个数。
-
记录所有进制中 1 的个数的最大值。
关键在于如何高效地进行进制转换和计数。可以使用除法和取模运算来实现进制转换,同时统计 1 的出现次数。
时间复杂度分析:对于每个数 ,需要尝试 35 种进制(2 到 36),每次转换的时间复杂度为 。因此总的时间复杂度为
参考代码
- Python
def solve():
# 读取输入的十进制数
n = int(input())
# 初始化最大1的个数为0
max_ones = 0
# 遍历2到36的所有进制
for base in range(2, 37):
num, ones = n, 0
# 进行进制转换,同时统计1的个数
while num:
if num % base == 1:
ones += 1
num //= base
# 更新最大1的个数
max_ones = max(max_ones, ones)
# 输出结果
print(max_ones)
# 调用主函数
solve()
- Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读取输入的十进制数
int n = sc.nextInt();
// 初始化最大1的个数为0
int maxOnes = 0;
// 遍历2到36的所有进制
for (int base = 2; base <= 36; base++) {
int num = n, ones = 0;
// 进行进制转换,同时统计1的个数
while (num > 0) {
if (num % base == 1) {
ones++;
}
num /= base
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
这里收集了超全的刷题笔记,欢迎大家的订阅,会持续跟新的