【秋招笔试】24-07-27-科大讯飞提前批-研发岗笔试题

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

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

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

总结

本次的笔试难度跨度较大,前两题比较简单,最后一题需要 前缀和优化DP 解决,其中 PythonJava 在笔试中据说会超时(Cpp 选手狂喜)

alt

😒 01.心情管理大师

问题描述

K小姐是一名心理咨询师,她最近在研究人们的心情变化规律。她发现,当一个人连续工作时,每天的心情指数会下降 点;而当这个人休息一天时,心情指数会上升1点。

K小姐想要帮助她的客户A先生进行心情管理。A先生目前的心情指数为0,他计划先连续工作 天,然后开始休假。K小姐想知道,从A先生开始工作到他的心情指数再次回到0,总共需要多少天。

请你帮助K小姐编写一个程序,计算出这个天数。

输入格式

第一行给出测试用例的数量

随后 行,每行给出 的值,用空格分隔。

输出格式

输出 行,每行一个整数,表示对应测试用例的答案。

样例输入

2
2 3
3 1

样例输出

9
4

数据范围

题解

  1. 计算 天工作后的心情指数变化:

  2. 计算需要多少天休息才能让心情指数回到0:

  3. 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,这是最多的情况。

数据范围

题解

  1. 对于给定的十进制数 ,遍历 2 到 36 的所有进制。

  2. 对于每种进制,将 转换为该进制的表示,并统计其中 1 的个数。

  3. 记录所有进制中 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%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

挣K存W养DOG:他真的很中意你,为什么不回他
点赞 评论 收藏
分享
3 7 评论
分享
牛客网
牛客企业服务