【秋招突围】2024届秋招-OPPO笔试题-第二套

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

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

📝 今天 OPPO2025届秋招 也是正式拉开帷幕啦

👏 感谢大家的订阅➕ 和 喜欢💗

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

alt

✨ 01.LYA 的魔法方阵

问题描述

LYA 是一位魔法学徒,她掌握了一种神奇的魔法阵,可以快速计算 方阵的行列式的值。然而,LYA 的导师认为仅仅计算行列式的值还不够有趣,他希望 LYA 能够直接构造出行列式等于给定值 方阵。

现在,LYA 想要尝试改进她的魔法阵,使其能够满足导师的要求。你能帮助 LYA 完成这个任务吗?

输入格式

输入仅一行,包含一个正整数 ,表示目标行列式的值。

输出格式

输出一个 的方阵,使其行列式的值等于 。方阵中的元素必须是非负整数且不超过 。如果存在多个满足条件的方阵,输出任意一个即可。

样例输入

5

样例输出

1 1
1 6

数据范围

题解

本题可以通过枚举的方式来解决。我们可以枚举方阵中的四个元素 , , , ,使得 。由于元素的取值范围为 ,因此我们可以使用四重循环来枚举所有可能的组合。

时间复杂度为 ,空间复杂度为

参考代码

  • Python
x = int(input())

for a in range(21):
    for b in range(21):
        for c in range(21):
            for d in range(21):
                if a * d - b * c == x:
                    print(a, b)
                    print(c, d)
                    exit(0)
  • Java
import java.util.Scanner;

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

        for (int a = 0; a <= 20; a++) {
            for (int b = 0; b <= 20; b++) {
                for (int c = 0; c <= 20; c++) {
                    for (int d = 0; d <= 20; d++) {
                        if (a * d - b * c == x) {
                            System.out.println(a + " " + b);
                            System.out.println(c + " " + d);
                            return;
                        }
                    }
                }
            }
        }
    }
}
  • Cpp
#include <iostream>
using namespace std;

int main() {
    int x;
    cin >> x;

    for (int a = 0; a <= 20; a++) {
        for (int b = 0; b <= 20; b++) {
            for (int c = 0; c <= 20; c++) {
                for (int d = 0; d <= 20; d++) {
                    if (a * d - b * c == x) {
                        cout << a << " " << b << endl;
                        cout << c << " " << d << endl;
                        return 0;
                    }
                }
            }
        }
    }

    return 0;
}

🌸 02.卢小姐的舞蹈连击

问题描述

卢小姐是一名热爱跳舞的女孩,她最喜欢的一款舞蹈游戏叫做"舞动青春"。

游戏中卢小姐可以在音乐的节奏下按照屏幕上的舞步提示进行跳舞。每跳对一个舞步就可以获得分数,而"连击"更是这个游戏的亮点:连续跳对舞步可以积攒"连击点",获得的分数为 ( 为基础得分, 为连击加分, 为连击次数)。

卢小姐每次连击成功,都会持续获得更高的分数。但是如果某个舞步跳错,虽然依然可以得到基础分,但是连击数会清零。

现在卢小姐想让你帮忙计算一局游戏中她的总得分。

输入格式

第一行输入三个正整数 ,分别代表本局游戏的总舞步数、基础得分和连击加分。()

第二行输入一个长度为 的字符串,仅包含字符 ox,其中 o 表示这个舞步跳对,x 表示这个舞步跳错。

输出格式

输出一个正整数,表示卢小姐本局游戏的总得分。

样例输入

5 2 1
oxoox

样例输出

14

数据范围

题解

这道题可以用一个变量 来记录当前的连击次数,初始值为0。遍历输入的字符串,对于每一个字符:

  • 如果是 o,说明这个舞步跳对,可以获得 的分数,并且连击次数 加1。
  • 如果是 x,说明这个舞步跳错,只能获得基础分 ,并且连击次数 要重置为0。

遍历结束后,累加的分数就是总得分。

时间复杂度 ,空间复杂度

参考代码

  • Python
n, a, b = map(int, input().split())
steps = input()

score = 0
combo = 0

for step in steps:
    score += a + b * combo
    
    if step == 'o':
        combo += 1
    else:
        combo = 0

print(score)
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int a = sc.nextInt();
        int b = sc.nextInt();
        String steps = sc.next();
        
        long score = 0;
        int combo = 0;
        
        for (char step : steps.toCharArray()) {
            score += a + (long) b * combo;
            
            if (step == 'o') {
                combo++;
            } else {
                combo = 0;
            }
        }
        
        System.out.println(score);
    }
}
  • Cpp
#include <iostream>
using namespace std;

int main() {
    int n, a, b;
    cin >> n >> a >> b;
    
    string steps;
    cin >> steps;
    
    long long score = 0;
    int combo = 0;
    
    for (char step : steps) {
        score += a + 1LL * b * combo;
        
  

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

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

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

全部评论
小伙伴们送送小红花啦,今天的题目已出,可以私聊学长抢先看哈
2 回复 分享
发布于 07-27 13:42 美国

相关推荐

10-05 23:02
东北大学 Java
我说句实话啊:那时候看三个月培训班视频,随便做个项目背点八股,都能说3 40w是侮辱价
点赞 评论 收藏
分享
4 13 评论
分享
牛客网
牛客企业服务