华为OD机试 - 洞穴探险 - 正则表达式(Java 2025 A卷 100分)

在这里插入图片描述

华为OD机试 2025A卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+E卷+B卷+C卷+D卷)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的时隙中也会记录其他数据。探索工作结束后,探险队需要获取到其成员在探险过程中相对于探险队总部的最近的足迹位置。

仪器记录坐标时,坐标的数据格式为(x,y),如(1,2)、(100,200),其中0

设定探险队总部的坐标为(0,0),某位置相对总部的距离为:xx+yy。

若两个坐标的相对总部的距离相同,则第一次到达的坐标为最远的足迹。

若记录仪中的坐标都不合法,输出总部坐标 (0,0) 。

备注:

不需要考虑双层括号嵌套的情况,比如sfsdfsd((1,2))。

二、输入描述

字符串,表示记录仪中的数据。

如:derga13fdsf3(100,200)f2r3rfasf(300,400)

三、输出描述

字符串,表示最远足迹的坐标。

如:(300,400)

四、测试用例

测试用例1:

1、输入

ferg(3,10)a13fdsf3(3,4)f2r3rfasf(5,10)

2、输出

(5,10)

3、说明

字符串包含三个坐标 (3,10), (3,4), (5,10)
计算距离:(3,10) = 109,(3,4) = 25,(5,10) = 125
最远的是 (5,10),距离为 125

测试用例2:

1、输入

asfefaweawfaw(0,1)fe

2、输出

(0,0)

3、说明

坐标 (0,1) 不合法,因为 x=0 不满足 0 没有合法坐标,所以输出 (0,0)

五、解题思路

选用正则表达式是因为它能高效地从复杂文本中提取特定模式的信息,非常适合从混杂文本中提取坐标。

具体步骤:

  1. 使用正则表达式 ((\d+),(\d+)) 从输入字符串中提取所有形如 (x,y) 的坐标。
  2. 对每个合法坐标,计算其到原点 (0,0) 的距离平方:x²+y²
  3. 记录最大距离及其对应坐标
  4. 如果距离相同,保留第一个出现的坐标
  5. 如果没有找到合法坐标,返回 (0,0)

六、Java算法源码

public class OdTest {
    public static void main(String[] args) {
        // 创建Scanner对象用于读取控制台输入
        Scanner scanner = new Scanner(System.in);
        // 读取一行输入
        String input = scanner.nextLine();
        // 关闭Scanner
        scanner.close();

        // 调用findFarthestFootprint方法找出最远足迹
        String result = findFarthestFootprint(input);
        // 输出结果
        System.out.println(result);
    }

    /**
     * 找出最远的足迹坐标
     * @param input 包含坐标信息的输入字符串
     * @return 最远足迹的坐标字符串
     */
    public static String findFarthestFootprint(String input) {
        // 使用正则表达式匹配所有(x,y)格式的坐标
        Pattern pattern = Pattern.compile("\\((\\d+),(\\d+)\\)");
        Matcher matcher = pattern.matcher(input);

        long maxDistance = -1;  // 初始化最大距离为-1
        String farthestPoint = "(0,0)";  // 默认结果为(0,0)

        // 遍历所有匹配到的坐标
        while (matcher.find()) {
            String x = matcher.group(1);  // 提取x坐标
            String y = matcher.group(2);  // 提取y坐标

            // 检查坐标是否合法
            if (isValidCoordinate(x, y)) {
                int xVal = Integer.parseInt(x);
                int yVal = Integer.parseInt(y);

                // 计算距离 (x*x + y*y)
                long distance = (long)xVal * xVal + (long)yVal * yVal;

                // 更新最远足迹
                if (distance > maxDistance) {
                    maxDistance = distance;
                    farthestPoint = "(" + x + "," + y + ")";
                }
            }
        }

        return farthestPoint;
    }

    /**
     * 检查坐标是否合法
     * @param x x坐标字符串
     * @param y y坐标字符串
     * @return 坐标是否合法
     */
    public static boolean isValidCoordinate(String x, String y) {
        // 检查x和y是否有前导0
        if ((x.length() > 1 && x.startsWith("0")) || (y.length() > 1 && y.startsWith("0"))) {
            return false;
        }

        try {
            int xVal = Integer.parseInt(x);
            int yVal = Integer.parseInt(y);

            // 检查x和y是否在有效范围内 (0
            return xVal > 0 && xVal < 1000 && yVal > 0 && yVal < 1000;
        } catch (NumberFormatException e) {
            return false;
        }
    }
}

七、效果展示

1、输入

test(01,5)example(5,05)valid(5,5)

2、输出

(5,5)

3、说明

(01,5) 和 (5,05) 有前导零,不合法
只有 (5,5) 是合法坐标

下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2025 A卷 200分)

本文收录于,华为OD机试(JAVA)真题(A卷+E卷+B卷+C卷+D卷)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,java,开发语言,华为OD机试,2025A卷)