华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
小明在玩一个游戏,游戏规则 如下:在游戏开始前,小明站在坐标轴原点处(坐标值为0)。
给定一组指令和一个幸运数,每个指令包含一个整数,小明按照指令前进指定步数或者后退指定步数。前进代表朝坐标轴Q的正方向走,后退代表朝坐标轴的负方向走。
幸运数为一个整数,如果某个指令为正好和幸运数相等,则小明行进步数+1。
例如:
幸运数为3,指令为[2,3,0,-5]
指令为2,表示前进2步;
指令为3,正好和幸运数相等,前进3+1=4步;
指令为0,表示原地不动,既不前进,也不后退;
指令为-5,表示后退5步。
请你计算小明在整个游戏过程中过,小明所处的最大坐标值。
二、输入描述
第一行输入1个数字n,代表指令的总个数 n(1 <= n <= 100)
第二行输入1个数字m,代表幸运数m(-100 <= m <= 100)
第三行输入n个数字,每个指令的值范围为:-100 <= 指令值 <= 100
三、输出描述
输出在整个游戏过程中过,小明所处的最大坐标值。异常情况输出:12345
四、测试用例
测试用例1:
1、输入
2
1
-5 1
2、输出
0
3、说明
总共2个指令,幸运数为1,按照指令行进,依次如下:
- 游戏开始前,站在坐标轴原点,此时坐标值为0;
- 指令为-5,后退5步,此时坐标值为-5;
- 指令为1,正好等于幸运数,前进1+1=2步,此时坐标值为-3;
- 整个游戏过程中,小明所处的坐标值依次为[0, -5, -3],最大坐标值为0。
测试用例2:
1、输入
5
-5
5 1 6 0 -7
2、输出
12
3、说明
指令 5,前进5步,坐标变为 5。
指令 1,前进1步,坐标变为 6。
指令 6,前进6步,坐标变为 12。
指令 0,不变。
指令 -7,后退7步,坐标变为 5。
最大坐标值是 12。
五、解题思路
- 小明一开始在坐标轴的原点,即位置为 0。
- 设置一个变量 maxCoordinate 用于记录小明在整个游戏过程中到达的最大坐标值。
- 对每个指令进行遍历,并根据指令值更新小明的当前位置:
- 如果指令值为正数,则小明向坐标轴的正方向前进相应步数。
- 如果指令值为负数,则小明向坐标轴的负方向后退相应步数。
- 如果指令值为0,小明的位置保持不变。
- 如果指令值等于幸运数 m,则增加额外的一步,对于正数指令,多前进一步。对于负数指令,多后退一步。
- 每次更新位置后,将当前位置与 maxCoordinate 进行比较,若当前位置大于 maxCoordinate,则更新 maxCoordinate。
- 在遍历完所有指令后,输出记录的最大坐标值。
- 如果输入数据不符合预期或者发生异常,可以设定一个特殊值(如 12345)来表示异常情况。
六、Python算法源码
# 导入sys模块以便读取标准输入
import sys
def main():
try:
# 读取所有输入并拆分为列表
input_list = sys.stdin.read().split()
# 将输入转换为整数列表
nums = list(map(int, input_list))
# 读取指令的总个数n和幸运数m
n = nums[0]
m = nums[1]
# 初始化最大坐标值和当前坐标值
max_coordinate = 0
current_position = 0
# 从第三个元素开始读取n个指令
for i in range(n):
instruction = nums[2 + i]
# 判断当前指令是否为幸运数m
if instruction == m:
if instruction > 0:
# 如果指令大于0,增加instruction + 1
current_position += instruction + 1
else:
# 如果指令小于等于0,增加instruction - 1
current_position += instruction - 1
else:
# 如果指令不为幸运数,直接增加instruction
current_position += instruction
# 更新最大坐标值
if current_position > max_coordinate:
max_coordinate = current_position
# 输出最大坐标值
print(max_coordinate)
except:
# 异常情况下输出12345
print("12345")
# 调用主函数
if __name__ == "__main__":
main()
七、JavaScript算法源码
// 使用标准输入输出模块
const readline = require('readline');
// 创建接口以读取标准输入
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// 存储所有输入数据
let input = [];
// 监听每一行输入
rl.on('line', (line) => {
input = input.concat(line.trim().split(/\s+/).map(Number));
}).on('close', () => {
try {
// 读取指令的总个数n和幸运数m
const n = input[0];
const m = input[1];
// 初始化最大坐标值和当前坐标值
let maxCoordinate = 0;
let currentPosition = 0;
// 循环处理每个指令
for (let i = 0; i < n; i++) {
const instruction = input[2 + i];
if (instruction === m) {
// 如果指令等于幸运数m,根据指令的正负调整位置
if (instruction > 0) {
currentPosition += instruction + 1;
} else {
currentPosition += instruction - 1;
}
} else {
// 如果指令不等于幸运数,直接调整位置
currentPosition += instruction;
}
// 更新最大坐标值
if (currentPosition > maxCoordinate) {
maxCoordinate = currentPosition;
}
}
// 输出最大坐标值
console.log(maxCoordinate);
} catch (e) {
// 异常情况下输出12345
console.log("12345");
}
});
八、C算法源码
#include <stdio.h>
int main() {
int n, m;
// 读取指令的总个数n和幸运数m
if (scanf("%d %d", &n, &m) != 2) {
// 如果输入不符合要求,输出12345并退出
printf("12345\n");
return 0;
}
int max_coordinate = 0; // 初始化最大坐标值
int current_position = 0; // 初始化当前坐标值
int instruction;
// 循环读取n个指令
for (int i = 0; i < n; i++) {
if (scanf("%d", &instruction) != 1) {
// 如果指令读取失败,输出12345并退出
printf("12345\n");
return 0;
}
if (instruction == m) {
// 如果指令等于幸运数m,根据指令的正负调整位置
if (instruction > 0) {
current_position += instruction + 1;
} else {
current_position += instruction - 1;
}
} else {
// 如果指令不等于幸运数,直接调整位置
current_position += instruction;
}
// 更新最大坐标值
if (current_position > max_coordinate) {
max_coordinate = current_position;
}
}
// 输出最大坐标值
printf("%d\n", max_coordinate);
return 0;
}
九、C++算法源码
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false); // 关闭同步,加快输入速度
cin.tie(0); // 解绑cin和cout
int n, m;
// 读取指令的总个数n和幸运数m
if (!(cin >> n >> m)) {
// 如果输入失败,输出12345并退出
cout << "12345\n";
return 0;
}
int max_coordinate = 0; // 初始化最大坐标值
int current_position = 0; // 初始化当前坐标值
int instruction;
// 循环读取n个指令
for (int i = 0; i < n; i++) {
if (!(cin >> instruction)) {
// 如果指令读取失败,输出12345并退出
cout << "12345\n";
return 0;
}
if (instruction == m) {
// 如果指令等于幸运数m,根据指令的正负调整位置
if (instruction > 0) {
current_position += instruction + 1;
} else {
current_position += instruction - 1;
}
} else {
// 如果指令不等于幸运数,直接调整位置
current_position += instruction;
}
// 更新最大坐标值
if (current_position > max_coordinate) {
max_coordinate = current_position;
}
}
// 输出最大坐标值
cout << max_coordinate << "\n";
return 0;
}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。