【秋招笔试】8.17京东秋招第二场-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试

💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导

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

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

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

🍒 本专栏已收集 50+ 套笔试题,笔试真题 会在第一时间跟新

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力 💞!

alt

🌰 京东春招第二场,来咯 !!!

1️⃣ 是个简单的数学题,梦回(首项+尾项) * 项数 / 2

2️⃣ 看起来很复杂,实际数据范围不大,直接模拟即可

3️⃣ 第三题是一道和图论结合的DP,难度中等偏上

⚡️ 01.K小姐的花园围栏

问题描述

K小姐有一个美丽的花园,她想要在花园周围建造一道独特的围栏。这道围栏由一系列木桩组成,从左到右,每根木桩的高度都比前一根高出一个递增的值。具体来说,第一根木桩高度为 1,第二根比第一根高 2,第三根比第二根高 3,以此类推。每两根木桩之间的间隔都是 1 单位。

一天,K小姐的花园下了一场大雪,但她不知道雪的具体厚度。现在,她只能看到某两根相邻木桩在雪面上露出的高度。K小姐想要通过这两个数字来计算出雪的厚度。你能帮助她解决这个问题吗?

输入格式

输入一行,包含两个整数 ,分别表示相邻两根木桩在雪面上露出的高度。

输出格式

输出一个整数,表示雪的厚度。保证答案存在。

样例输入

8 13

样例输出

2

样例解释

在这个例子中,露出雪面的是第 4 根和第 5 根木桩。原本第 4 根木桩的高度是 10,第 5 根木桩的高度是 15。雪的厚度为 2,所以它们在雪面上的高度分别为 8 和 13。

数据范围

题解

本题的核心思路是利用等差数列的性质。

木桩高度形成了一个特殊的等差数列,相邻两项的差构成了一个自然数列。

通过给定的两个相邻木桩露出的高度,我们可以确定它们在原序列中的位置。

计算出原本的高度后,与露出的高度相减即可得到雪的厚度。

参考代码

  • Python
import sys

# 读取输入
input = lambda: sys.stdin.readline().strip()
a, b = map(int, input().split())

# 计算相邻木桩高度差
d = b - a

# 利用等差数列求和公式计算原始高度
original_height = (1 + d) * d // 2

# 计算雪的厚度
snow_depth = original_height - b

# 输出结果
print(snow_depth)
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 创建Scanner对象读取输入
        Scanner scanner = new Scanner(System.in);
        
        // 读取两个整数a和b
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        
        // 计算相邻木桩高度差
        int d = b - a;
        
        // 利用等差数列求和公式计算原始高度
        int originalHeight = (1 + d) * d / 2;
        
        // 计算雪的厚度
        int snowDepth = originalHeight - b;
        
        // 输出结果
        System.out.println(snowDepth);
        
        // 关闭Scanner
        scanner.close();
    }
}
  • Cpp
#include <iostream>
using namespace std;

int main() {
    // 声明变量
    int a, b;
    
    // 读取输入
    cin >> a >> b;
    
    // 计算相邻木桩高度差
    int d = b - a;
    
    // 利用等差数列求和公式计算原始高度
    int original_height = (1 + d) * d / 2;
    
    // 计算雪的厚度
    int snow_depth = original_height - b;
    
    // 输出结果
    cout << snow_depth << endl;
    
    return 0;
}

🍑 02.积木拼接大挑战

问题描述

LYA是一位热爱DIY的少女,她最近迷上了一种特殊的积木拼接游戏。这种积木呈长条状,每个单位长度的高度只有1或2两种可能。LYA现在手里有两块这样的积木,长度分别为

她想要将这两块积木拼接在一起,形成一个新的积木作品。拼接时可以有重叠,也可以有间隙,但最终拼接后的积木高度不能超过 。LYA希望在满足这个条件的前提下,使最终拼接出的积木尽可能短。

你能帮助LYA计算出拼接后积木的最短可能长度吗?

输入格式

第一行包含两个正整数 ,分别表示两块积木的长度。

第二行包含 个整数,表示第一块积木每个单位长度的高度。

第三行包含 个整数,表示第二块积木每个单位长度的高度。

输出格式

输出一个整数,表示拼接后积木的最短可能长度。

样例输入1

7 10
2212112
2112112112

样例输出1

10

样例输入2

3 2
222
22

样例输出2

5

数据范围

题解

本题的核心思路是枚举两块积木的重叠位置,计算最短拼接长度。

具体步骤如下:

  1. 遍历第一块积木的每个位置作为重叠起点
  2. 检查从该位置开始,两块积木重叠部分的高度和是否都不超过3
  3. 如果满足条件,计算当前拼接长度,更新最短长度
  4. 考虑两种拼接顺序(1在前或2在前),取最小值

时间复杂度为 ,空间复杂度为 。需要注意边界情况的处理,特别是当两块积木无法重叠时,应返回它们长度之和。

参考代码

  • Python
# 读取输入
n, m = map(int, input().split())
block1 = list(map(int, input().strip()))
block2 = list(map(int, input().strip()))

def check_overlap(s1, s2):
    """
    检查两个积木的重叠情况,计算最短拼接长度
    :param s1: 第一个积木的高度序列
    :param s2: 第二个积木的高度序列
    :return: 最短拼接长度
    """
    res = len(s1) + len(s2)  # 初始化为两个积木长度之和
    for i in range(len(s1)):
        valid = True
        for j in range(min(len(s2), len(s1) - i)):
            if s1[i+j] + s2[j] > 3:
                valid = False
                break
        if valid:
            res = min(res, max(len(s1), i + len(s2)))
    return res

# 计算两种拼接顺序的最短长度,取较小值
result = min(check_overlap(block1, block2), check_overlap(block2, block1))
print(result)
  • Java
import java.util.Scanner;

public class Main {
    static Scanner sc = new Scanner(System.in);
    
    static int checkOverlap(String s1, String s2) {
        // 检查两个积木的重叠情况,计算最短拼接长度
        int res = s1.length() + s2.length();
        for (int i = 0; i < s1.length(); i++) {
            boolean isValid = true;
            for (int j = 0; j < s2.length() && i + j < s1.length(); j++) {
                if (s1.charAt(i+j) - '0' + s2.charAt(j) - '0' > 3) {
                    isValid = false;
                    break;
                }
            }
            if (isValid) {
                res = Math.min(res, Math.max(s1.length(), i + s2.length()));
            }
        }
        return res;
    }
    
    public static void main(String[] args) {
        // 读取输入
        int len1 = sc.nextInt();
        int len2 = sc.nextInt();
        String str1 = sc.next();
        String str2 = sc.next();
        
        // 计算两种拼接顺序的最短长度,取较小值
        int result = Math.min(checkOverlap(str1, str2), checkOverlap(str2, str1));
        System.out.println(result);
    }
}
  • Cpp
#include <iostream

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

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

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

全部评论
此套为后端岗的
点赞 回复 分享
发布于 08-17 12:11 江苏
第三题,居然有重边,为什么不用考虑有环,甚至自环的情况?
点赞 回复 分享
发布于 08-17 18:14 浙江
k小姐围栏我一样的思路只过45%,不明白
点赞 回复 分享
发布于 08-17 19:55 北京

相关推荐

死在JAVA的王小美:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,我也是,让我免了一轮,但是硬气拒绝了
点赞 评论 收藏
分享
评论
2
6
分享
牛客网
牛客企业服务