最大坐标值 - 华为OD统一考试(C卷)
OD统一考试(C卷)
分值: 100分
题解: Java / Python / C++
题目描述
小明在玩一个游戏,游戏规则如下:在游戏开始前,小明站在坐标轴原点处(坐标值为0)给定一组指令和一个幸运数,每个指令都是一个整数,小明按照指定的要求前进或者后退指定的步数。
前进代表朝坐标轴的正方向走,后退代表朝坐标轴的负方向走,幸运数为一个整数,如果某个指令正好和幸运数相等,则小明行进步数加 1。
例如: 幸运数为 3,指令内[ 2 , 3 , 0 , −5 ]
指令为 2,表示前进 2步
指令为 3 正好好和幸运数相等,前进 3+1=4步
指令为 0,表示原地不动,既不前进,也不后退
指令为 5,表示后退 5步。
请你计算小明在整个游戏过程中,小明所处的最大坐标值。
输入描述
第一行输入 1 个数字,代表指令的总个数 n
( 1≤n
≤100)
第二行输入 1 个数字,代表幸运数 m
( −100≤m
≤100)
第三行输入 n
个指令,每个指令值的取值范围为: −100≤指令值≤100
输出描述
输出在整个游戏过程中,小明所处的最大坐标值。异常情况下输出:12345
示例1
输入:
2
1
-5 1
输出:
0
说明:
总共 2 个指令,幸运数为 1 ,依照指令行进,依次如下游戏开始前,站在坐标轴原点,此时坐标值为 0;
指令为 −5 ,后退5 步 ,此时坐标值为−5 ;
指令为 1,正好等于幸运数,前进 1+1=2步,此时坐标值为 −3;
整个游戏过程中,小明所处的坐标值依次为[0,−5,−3],最大坐标值为 0。
示例2
输入:
5
-5
-5 1 6 0 -7
输出:
1
说明:
总共 5 个指令,幸运数为 −5,依照指令行进,依次如下:
游戏开始前,站在坐标轴原点,此时坐标值为 0,
指令为 −5,正好等于幸运数,后退 5+1=6步,此时坐标值为 −6;
指令为 1,前进 1 步此时坐标值为 −5 ;
指令为 6 ,前进 6 步此时坐标值为1 ;
指令为 0 ,既不前进也不后退,此时坐标值为 1 ;
指令为 −7,后退 7步,此时坐标值为 −6。
整个游戏过程中,小明所处的坐标值依次为 [0,−6,−5,1,1,−6],最大坐标值为 1。
题解
这道题属于模拟题,根据题目描述,小明根据一系列指令在坐标轴上移动,其中某个指令和幸运数相等时,小明的移动步数要加1。题目要求计算小明整个游戏过程中所处的最大坐标值。
解题思路:
- 读取输入,包括指令总个数
n
、幸运数m
以及n个指令的值。- 根据题目要求,将幸运数映射成对应的指令值(lucky)。如果幸运数为正,映射为
m+1
;如果幸运数为负,映射为m-1
。- 使用变量
x
记录小明在坐标轴上的位置,使用变量max_x
记录整个游戏过程中的最大坐标值。- 遍历每个指令,如果当前指令值等于幸运数,将其替换为映射后的值,然后更新小明的位置
x
,并比较更新最大坐标值max_x
。- 输出最大坐标值
max_x
。在实现中,使用循环遍历每个指令,更新小明的坐标位置,并保持最大坐标值。最后输出最大坐标值即可。
注意在模拟的过程中要检验输入数据的有效性。
Java
import java.util.Scanner;
/**
* @author code5bug
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int lucky = (m >= 0) ? m + 1 : m - 1; // 幸运数对应的指令
boolean normal = true;
if (!validateRange(n, 1, 100) || !validateRange(m, -100, 100)) {
normal = false; // 异常输入
}
// 小明在坐标轴的位置, 小明所处坐标轴的最大位置
int x = 0, max_x = 0;
for (int i = 0; i < n; i++) {
int command = scanner.nextInt();
if (!validateRange(command, -100, 100)) {
normal = false; // 异常数据范围
}
if (command == m) {
command = lucky;
}
x += command;
max_x = Math.max(max_x, x);
}
System.out.println(normal ? max_x : 12345);
}
public static boolean validateRange(int num, int min, int max) {
if (num < min || num > max) {
return false;
} else {
return true;
}
}
}
Python
def validate_range(num, min_val, max_val):
"""
验证输入数字是否在指定范围内。
如果数字在指定范围内,则返回 True,否则返回 False。
"""
if min_val <= num <= max_val:
return True
else:
return False
def main():
n, m = int(input()), int(input())
lucky = m + 1 if m >= 0 else m - 1 # 幸运数对应的指令
normal = True
if not validate_range(n, 1, 100) or not validate_range(m, -100, 100):
normal = False # 异常输入
# 小明在坐标轴的位置, 小明所处坐标轴的最大位置
x, max_x = 0, 0
for command in map(int, input().split()):
if not validate_range(command, -100, 100): # 异常数据范围
normal = False
if command == m:
command = lucky
x += command
max_x = max(max_x, x)
print(max_x if normal else 12345)
if __name__ == "__main__":
main()
C++
#include <bits/stdc++.h>
using namespace std;
bool validate_range(int num, int min, int max)
{
if (num < min || num > max) {
return false;
} else {
return true;
}
}
int main()
{
int n, m;
cin >> n >> m;
int lucky = (m >= 0) ? m + 1 : m - 1; // 幸运数对应的指令
bool normal = true;
if (!validate_range(n, 1, 100) || !validate_range(m, -100, 100)) {
normal = false;
}
// 小明在坐标轴的位置, 小明所处坐标轴的最大位置
int x = 0, max_x = 0;
for (int i = 0, command; i < n; i++) {
cin >> command;
if (!validate_range(command, -100, 100)) normal = false;
if (command == m) command = lucky;
x += command;
max_x = max(max_x, x);
}
cout << (normal ? max_x : 12345) << endl;
return 0;
}
🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏
#面经##秋招##春招##校招##华为#