【秋招笔试】8.17京东秋招第二场-三语言题解
🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试
💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导
✨ 本系列打算持续跟新
春秋招笔试题
👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸
✨ 笔试合集传送们 -> 🧷春秋招笔试合集
🍒 本专栏已收集
50+
套笔试题,笔试真题
会在第一时间跟新🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力 💞!
🌰 京东春招第二场,来咯 !!!
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
数据范围
题解
本题的核心思路是枚举两块积木的重叠位置,计算最短拼接长度。
具体步骤如下:
- 遍历第一块积木的每个位置作为重叠起点
- 检查从该位置开始,两块积木重叠部分的高度和是否都不超过3
- 如果满足条件,计算当前拼接长度,更新最短长度
- 考虑两种拼接顺序(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%内容,订阅专栏后可继续查看/也可单篇购买
这里收集了超全的刷题笔记,欢迎大家的订阅,会持续跟新的