最大坐标值 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

小明在玩一个游戏,游戏规则如下:在游戏开始前,小明站在坐标轴原点处(坐标值为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。题目要求计算小明整个游戏过程中所处的最大坐标值。

解题思路:

  1. 读取输入,包括指令总个数 n、幸运数 m以及n个指令的值。
  2. 根据题目要求,将幸运数映射成对应的指令值(lucky)。如果幸运数为正,映射为 m+1;如果幸运数为负,映射为 m-1
  3. 使用变量 x 记录小明在坐标轴上的位置,使用变量 max_x 记录整个游戏过程中的最大坐标值。
  4. 遍历每个指令,如果当前指令值等于幸运数,将其替换为映射后的值,然后更新小明的位置 x,并比较更新最大坐标值 max_x
  5. 输出最大坐标值 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;
}

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#面经##秋招##春招##校招##华为#
全部评论

相关推荐

人力小鱼姐:实习经历没有什么含金量,咖啡店员迎宾这种就别写了,其他两段包装一下 想找人力相关的话,总结一下个人优势,结合校园经历里有相关性的部分,加一段自我评价
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务