得物笔试 得物笔试题 0828

笔试时间:2024年08月28日 秋招

历史笔试传送门:2023秋招笔试合集

第一题

题目:

已知小红每次可以把一个数字向下拨动,即9变成8,8变成7...1变成0,0变成9。她想知道从第一个状态变成第二个状态需要最少拨动多少次?

输入描述

两个长度为4的、仅由数字字符组成的字符串,用空格隔开。

输出描述

最小的拨动次数。

样例输入

9999 8888

样例输出

4

参考题解

代码读取两个4位数的字符串,start和target,表示锁的初始状态和目标状态。对于每个数字位置,计算两个字符串对应数字之间的差值。

所需的最小旋转是通过考虑直接移动(例如,9到8是1个移动)和环绕移动(例如,0到9是1个移动)来确定的。的数学。最小函数用于在直接和绕行选项之间找到较小的移动次数。总步数被累积并打印为结果。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <string>

int main() {
    std::string start, target;
    std::cin >> start >> target;

    int moves = 0;

    for (int i = 0; i < 4; i++) {
        int startDigit = start[i] - '0';
        int targetDigit = target[i] - '0';

        int diff;
        if (startDigit >= targetDigit) {
            diff = startDigit - targetDigit;
        } else {
            diff = startDigit + 10 - targetDigit;
        }

        moves += diff;
    }

    std::cout << moves << std::endl;

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class LockRotation {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String start = scanner.next();
        String target = scanner.next();
        scanner.close();

        int moves = 0;
        
        for (int i = 0; i < 4; i++) {
            int startDigit = start.charAt(i) - '0';
            int targetDigit = target.charAt(i) - '0';
            
            int diff;
            if (startDigit >= targetDigit) {
                diff = startDigit - targetDigit;
            } else {
                diff = startDigit + 10 - targetDigit;
            }
            
            moves += diff;
        }
        
        System.out.println(moves);
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

start = input().strip()
target = input().strip()

moves = 0

for i in range(4):
    start_digit = int(start[i])
    target_digit = int(target[i])

    if start_digit >= target_digit:
        diff = start_digit - target_digit
    else:
        diff = start_digit + 10 - target_digit

    moves += diff

print(moves)

第二题

题目

小红和小紫正在玩一个游戏,每一关都有一个分数。如果某人某一关分数比上一关高,但另一个人这一关分数比上一关低,那么他就可以嘲笑对方。如果两个人这一关游戏的分数都比上一关多,则增量更多的可以嘲笑对方;如果两个人这一关游戏的分数都比上一关少,则减量更少的可以嘲笑对方。只有当他们的增量相同或者减量相同时,才不会互相嘲笑。例如,假设小红第一关的分数为5,第二关的分数为10;小紫第一关的分数为2,第二关的分数为8,显然小红增加的比小紫多,那么小红就可以嘲笑小紫。现在给定了小红和小紫每一关的分数,你可以选择一段连续的关卡,使得这一段关卡中两个人都不会互相嘲笑,问最多可以选择多少个关卡。特别的,一段连续关卡中的第一关两人不会互相嘲笑。

输入描述

第一行输入一个正整数n,代表关卡数;

第二行输入n个整数ai,代表小红每一关的分数;

第三行输入n个整数bi;,代表小紫每一关的分数。

2 ≤ n ≤ 10^5,-10^9 ≤ ai,bi ≤ 10^9

输出描述

输出可以选择最多的关卡数。

样例输入

5

1 2 3 1 3

-1 0 3 -1 1

样例输出

2

参考题解

滑动窗口+双指针。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    int n;
    std::cin >> n;
    std::vector<int> a(n), b(n);

    for (int i = 0; i < n; ++i) {
        std::cin >> a[i];
    }
    for (int i = 0; i < n; ++i) {
        std::cin >> b[i];
    }

    in

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

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

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