• 【华为OD机试|01】最远足迹(Java/C/Py/JS)


    目录

    一、题目介绍

    1.1 题目描述

    1.2 备注:

    1.3 输入描述

    1.4 输出描述

    1.5 用例

    二、Java代码实现

    2.1 实现思路

    2.2 详细代码

    2.3 代码讲解:

    三、C语言实现

    3.1实现步骤

    3.2 实现代码

    3.3 代码详解

    四、Python实现

    4.1 实现步骤

    4.2 代码实现

    4.3 详细讲解

    五、JS实现

    5.1 实现步骤

    5.2 详细代码

    5.3详细讲解

    六、总结


    一、题目介绍

    1.1 题目描述

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

    1. 仪器记录坐标时,坐标的数据格式为(x,y),如(1,2)、(100,200),其中0
    2. 设定探险队总部的坐标为(0,0),某位置相对总部的距离为:x*x+y*y。
    3. 若两个座标的相对总部的距离相同,则第一次到达的坐标为最远的足迹。
    4. 若记录仪中的坐标都不合法,输出总部坐标(0,0)。

    1.2 备注:

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

    1.3 输入描述

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

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

    1.4 输出描述

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

    如: (300,400)

    1.5 用例

    输入ferg(3,10)a13fdsf3(3,4)f2r3rfasf(5,10)
    输出(5,10)
    说明记录仪中的合法坐标有3个: (3,10), (3,4), (5,10),其中(5,10)是相距总部最远的坐标, 输出(5,10)。
    输入asfefaweawfaw(0,1)fe
    输出(0,0)
    说明记录仪中的坐标都不合法,输出总部坐标(0,0)。

    二、Java代码实现

    实现这个题目,需要解析字符串中的有效坐标,计算它们到总部 (0,0) 的距离,并找出最远的一个坐标。如果记录中的所有坐标都不合法,我们将返回总部坐标 (0,0)。

    2.1 实现思路

    实现步骤如下:

    1. 解析字符串:提取出所有合法的坐标。
    2. 验证坐标合法性:确保坐标满足格式要求,且 x 和 y 在 (0,1000) 之间。
    3. 计算距离:计算每个合法坐标到总部 (0,0) 的距离。
    4. 找出最远的坐标:在所有合法坐标中找出距离最大的那个。
    5. 处理异常情况:如果没有合法坐标,返回总部坐标 (0,0)。

    2.2 详细代码

    下面是具体实现代码:

    1. import java.util.regex.Matcher;
    2. import java.util.regex.Pattern;
    3. public class CaveExploration {
    4. public static void main(String[] args) {
    5. String input = "ferga13fdsf3(100,200)f2r3rfasf(300,400)";
    6. System.out.println(findFarthestCoordinate(input));
    7. }
    8. public static String findFarthestCoordinate(String input) {
    9. // 定义正则表达式以提取合法的坐标
    10. Pattern pattern = Pattern.compile("\\((\\d{1,3}),(\\d{1,3})\\)");
    11. Matcher matcher = pattern.matcher(input);
    12. String farthestCoordinate = "(0,0)";
    13. int maxDistance = 0;
    14. while (matcher.find()) {
    15. String xStr = matcher.group(1);
    16. String yStr = matcher.group(2);
    17. int x = Integer.parseInt(xStr);
    18. int y = Integer.parseInt(yStr);
    19. // 检查坐标是否合法
    20. if (isValidCoordinate(xStr, yStr, x, y)) {
    21. int distance = x * x + y * y;
    22. if (distance > maxDistance) {
    23. maxDistance = distance;
    24. farthestCoordinate = "(" + x + "," + y + ")";
    25. }
    26. }
    27. }
    28. return farthestCoordinate;
    29. }
    30. // 验证坐标是否合法
    31. private static boolean isValidCoordinate(String xStr, String yStr, int x, int y) {
    32. return x > 0 && x < 1000 && y > 0 && y < 1000 &&
    33. !xStr.startsWith("0") && !yStr.startsWith("0");
    34. }
    35. }

    2.3 代码讲解:

    1. 字符串解析

    在Java中,我们使用正则表达式提取字符串中的坐标。

    1. Pattern pattern = Pattern.compile("\\((\\d{1,3}),(\\d{1,3})\\)");
    2. Matcher matcher = pattern.matcher(input);

    解析思路

    • 使用正则表达式 \\((\\d{1,3}),(\\d{1,3})\\) 匹配形如 (x,y) 的坐标,其中 x 和 y 是 1 到 3 位的数字。
    • matcher.find() 用于在输入字符串中查找所有符合正则表达式的子字符串。

    2. 合法性验证

    通过解析得到的字符串,进一步验证它们是否合法。

    1. private static boolean isValidCoordinate(String xStr, String yStr, int x, int y) {
    2. return x > 0 && x < 1000 && y > 0 && y < 1000 &&
    3. !xStr.startsWith("0") && !yStr.startsWith("0");
    4. }

    验证思路

    • 坐标 x 和 y 必须在 (0,1000) 范围内。
    • 坐标字符串不能以 "0" 开头,除非它是单个 "0"。

    3. 距离计算

    计算每个合法坐标到总部 (0,0) 的距离。

    通过这种方式,可以确保找出距离总部最远的合法坐标,并处理非法坐标和无坐标的情况。

    三、C语言实现

    使用C语言实现这个题目,我们需要解析字符串中的有效坐标,计算它们到总部 (0,0) 的距离,并找出最远的一个坐标。如果记录中的所有坐标都不合法,我们将返回总部坐标 (0,0)。

    3.1实现步骤

    1. 解析字符串:提取出所有合法的坐标。
    2. 验证坐标合法性:确保坐标满足格式要求,且 x 和 y 在 (0,1000) 之间。
    3. 计算距离:计算每个合法坐标到总部 (0,0) 的距离。
    4. 找出最远的坐标:在所有合法坐标中找出距离最大的那个。
    5. 处理异常情况:如果没有合法坐标,返回总部坐标 (0,0)。

    3.2 实现代码

    1. #include
    2. #include
    3. #include
    4. #include
    5. // 判断是否是合法的坐标
    6. int isValidCoordinate(char *xStr, char *yStr, int x, int y) {
    7. return x > 0 && x < 1000 && y > 0 && y < 1000 &&
    8. (xStr[0] != '0' || strlen(xStr) == 1) &&
    9. (yStr[0] != '0' || strlen(yStr) == 1);
    10. }
    11. int main() {
    12. char input[] = "ferga13fdsf3(100,200)f2r3rfasf(300,400)";
    13. char *ptr = input;
    14. char xStr[4], yStr[4];
    15. int maxDistance = 0;
    16. char farthestCoordinate[10] = "(0,0)";
    17. while ((ptr = strstr(ptr, "(")) != NULL) {
    18. if (sscanf(ptr, "(%3[0-9],%3[0-9])", xStr, yStr) == 2) {
    19. int x = atoi(xStr);
    20. int y = atoi(yStr);
    21. if (isValidCoordinate(xStr, yStr, x, y)) {
    22. int distance = x * x + y * y;
    23. if (distance > maxDistance) {
    24. maxDistance = distance;
    25. sprintf(farthestCoordinate, "(%d,%d)", x, y);
    26. }
    27. }
    28. }
    29. ptr++;
    30. }
    31. printf("%s\n", farthestCoordinate);
    32. return 0;
    33. }

    3.3 代码详解

    1. 字符串解析

    在C语言中,我们使用 strstrsscanf 来解析字符串。

    1. while ((ptr = strstr(ptr, "(")) != NULL) {
    2. if (sscanf(ptr, "(%3[0-9],%3[0-9])", xStr, yStr) == 2) {
    3. ...
    4. }
    5. ptr++;
    6. }

    2.解析思路

    • 使用 strstr 查找字符串中第一个 ( 的位置。
    • 使用 sscanf 提取括号中的数字对,格式为 (%3[0-9],%3[0-9]),确保读取的数字不超过3位。
    2. 合法性验证

    通过解析得到的字符串,进一步验证它们是否合法。

    1. int isValidCoordinate(char *xStr, char *yStr, int x, int y) {
    2. return x > 0 && x < 1000 && y > 0 && y < 1000 &&
    3. (xStr[0] != '0' || strlen(xStr) == 1) &&
    4. (yStr[0] != '0' || strlen(yStr) == 1);
    5. }

    验证思路

    • 坐标 x 和 y 必须在 (0,1000) 范围内。
    • 坐标字符串不能以 "0" 开头,除非它是单个 "0"。
    3. 距离计算

    计算每个合法坐标到总部 (0,0) 的距离。

    int distance = x * x + y * y;
    

    计算思路

    • 使用欧几里得距离的平方来比较不同坐标的远近,公式为 distance = x * x + y * y
    4. 找出最远的坐标

    在所有合法坐标中找出距离最大的那个。

    1. if (distance > maxDistance) {
    2. maxDistance = distance;
    3. sprintf(farthestCoordinate, "(%d,%d)", x, y);
    4. }

    思路

    • 使用变量 maxDistance 记录最大距离,每次计算新的距离后与之比较,更新最大距离和最远坐标。

    四、Python实现

    使用Python实现这个题目同样需要解析字符串中的有效坐标,计算它们到总部 (0,0) 的距离,并找出最远的一个坐标。如果记录中的所有坐标都不合法,我们将返回总部坐标 (0,0)。

    4.1 实现步骤

    1. 解析字符串:提取出所有合法的坐标。
    2. 验证坐标合法性:确保坐标满足格式要求,且 x 和 y 在 (0,1000) 之间。
    3. 计算距离:计算每个合法坐标到总部 (0,0) 的距离。
    4. 找出最远的坐标:在所有合法坐标中找出距离最大的那个。
    5. 处理异常情况:如果没有合法坐标,返回总部坐标 (0,0)。

    4.2 代码实现

    1. import re
    2. def find_farthest_coordinate(data):
    3. # 定义正则表达式以提取合法的坐标
    4. pattern = re.compile(r'\((\d{1,3}),(\d{1,3})\)')
    5. matches = pattern.findall(data)
    6. max_distance = 0
    7. farthest_coordinate = "(0,0)"
    8. for match in matches:
    9. x_str, y_str = match
    10. x = int(x_str)
    11. y = int(y_str)
    12. # 检查坐标是否合法
    13. if is_valid_coordinate(x_str, y_str, x, y):
    14. distance = x * x + y * y
    15. if distance > max_distance:
    16. max_distance = distance
    17. farthest_coordinate = f"({x},{y})"
    18. return farthest_coordinate
    19. def is_valid_coordinate(x_str, y_str, x, y):
    20. # 验证坐标是否合法
    21. return 0 < x < 1000 and 0 < y < 1000 and \
    22. not (x_str.startswith("0") and len(x_str) > 1) and \
    23. not (y_str.startswith("0") and len(y_str) > 1)
    24. # 示例输入
    25. input_data = "ferga13fdsf3(100,200)f2r3rfasf(300,400)"
    26. print(find_farthest_coordinate(input_data)) # 输出: (300,400)

    4.3 详细讲解

    1. 字符串解析

    在Python中,我们使用正则表达式提取字符串中的坐标。

    1. pattern = re.compile(r'\((\d{1,3}),(\d{1,3})\)')
    2. matches = pattern.findall(data)

    解析思路

    • 使用正则表达式 \((\d{1,3}),(\d{1,3})\) 匹配形如 (x,y) 的坐标,其中 x 和 y 是 1 到 3 位的数字。
    • findall 方法返回所有匹配的坐标对。

    2. 合法性验证

    通过解析得到的字符串,进一步验证它们是否合法。

    1. def is_valid_coordinate(x_str, y_str, x, y):
    2. return 0 < x < 1000 and 0 < y < 1000 and \
    3. not (x_str.startswith("0") and len(x_str) > 1) and \
    4. not (y_str.startswith("0") and len(y_str) > 1)

    验证思路

    • 坐标 x 和 y 必须在 (0,1000) 范围内。
    • 坐标字符串不能以 "0" 开头,除非它是单个 "0"。
    3. 距离计算

    计算每个合法坐标到总部 (0,0) 的距离。

    distance = x * x + y * y
    

    计算思路

    • 使用欧几里得距离的平方来比较不同坐标的远近,公式为 distance = x * x + y * y
    4. 找出最远的坐标

    在所有合法坐标中找出距离最大的那个。

    1. if distance > max_distance:
    2. max_distance = distance
    3. farthest_coordinate = f"({x},{y})"

    思路

    • 使用变量 max_distance 记录最大距离,每次计算新的距离后与之比较,更新最大距离和最远坐标。
    5. 处理异常情况

    如果没有合法坐标,最远的坐标默认为 (0,0)

    1. max_distance = 0
    2. farthest_coordinate = "(0,0)"

    思路

    • 初始时将最远坐标设为 (0,0),如果找到合法坐标,更新为最远坐标。

    通过上述步骤,可以在Python中实现解析字符串并找出距离总部最远的合法坐标,并处理非法坐标和无坐标的情况。

    五、JS实现

    使用JavaScript实现这个题目同样需要解析字符串中的有效坐标,计算它们到总部 (0,0) 的距离,并找出最远的一个坐标。如果记录中的所有坐标都不合法,我们将返回总部坐标 (0,0)。

    5.1 实现步骤

    1. 解析字符串:提取出所有合法的坐标。
    2. 验证坐标合法性:确保坐标满足格式要求,且 x 和 y 在 (0,1000) 之间。
    3. 计算距离:计算每个合法坐标到总部 (0,0) 的距离。
    4. 找出最远的坐标:在所有合法坐标中找出距离最大的那个。
    5. 处理异常情况:如果没有合法坐标,返回总部坐标 (0,0)。

    5.2 详细代码

    1. function findFarthestCoordinate(data) {
    2. // 定义正则表达式以提取合法的坐标
    3. const pattern = /\((\d{1,3}),(\d{1,3})\)/g;
    4. let matches;
    5. let maxDistance = 0;
    6. let farthestCoordinate = "(0,0)";
    7. while ((matches = pattern.exec(data)) !== null) {
    8. const xStr = matches[1];
    9. const yStr = matches[2];
    10. const x = parseInt(xStr, 10);
    11. const y = parseInt(yStr, 10);
    12. // 检查坐标是否合法
    13. if (isValidCoordinate(xStr, yStr, x, y)) {
    14. const distance = x * x + y * y;
    15. if (distance > maxDistance) {
    16. maxDistance = distance;
    17. farthestCoordinate = `(${x},${y})`;
    18. }
    19. }
    20. }
    21. return farthestCoordinate;
    22. }
    23. // 验证坐标是否合法
    24. function isValidCoordinate(xStr, yStr, x, y) {
    25. return x > 0 && x < 1000 && y > 0 && y < 1000 &&
    26. !(xStr.startsWith("0") && xStr.length > 1) &&
    27. !(yStr.startsWith("0") && yStr.length > 1);
    28. }
    29. // 示例输入
    30. const inputData = "ferga13fdsf3(100,200)f2r3rfasf(300,400)";
    31. console.log(findFarthestCoordinate(inputData)); // 输出: (300,400)

    5.3详细讲解

    1. 字符串解析

    在JavaScript中,我们使用正则表达式提取字符串中的坐标。

    1. const pattern = /\((\d{1,3}),(\d{1,3})\)/g;
    2. let matches;

    解析思路

    • 使用正则表达式 \((\d{1,3}),(\d{1,3})\) 匹配形如 (x,y) 的坐标,其中 x 和 y 是 1 到 3 位的数字。
    • pattern.exec(data) 用于在输入字符串中查找所有符合正则表达式的子字符串。

    2. 合法性验证

    通过解析得到的字符串,进一步验证它们是否合法。

    1. function isValidCoordinate(xStr, yStr, x, y) {
    2. return x > 0 && x < 1000 && y > 0 && y < 1000 &&
    3. !(xStr.startsWith("0") && xStr.length > 1) &&
    4. !(yStr.startsWith("0") && yStr.length > 1);
    5. }

    验证思路

    • 坐标 x 和 y 必须在 (0,1000) 范围内。
    • 坐标字符串不能以 "0" 开头,除非它是单个 "0"。

    3. 距离计算

    计算每个合法坐标到总部 (0,0) 的距离。

    const distance = x * x + y * y;
    

    计算思路

    • 使用欧几里得距离的平方来比较不同坐标的远近,公式为 distance = x * x + y * y
    4. 找出最远的坐标

    在所有合法坐标中找出距离最大的那个。

    1. if (distance > maxDistance) {
    2. maxDistance = distance;
    3. farthestCoordinate = `(${x},${y})`;
    4. }

    思路

    • 使用变量 maxDistance 记录最大距离,每次计算新的距离后与之比较,更新最大距离和最远坐标。
    5. 处理异常情况

    如果没有合法坐标,最远的坐标默认为 (0,0)

    1. let maxDistance = 0;
    2. let farthestCoordinate = "(0,0)";

    思路

    • 初始时将最远坐标设为 (0,0),如果找到合法坐标,更新为最远坐标。

    通过上述步骤,我们可以在JavaScript中实现解析字符串并找出距离总部最远的合法坐标,并处理非法坐标和无坐标的情况。

    六、总结

    在上述问题中,我们通过解析记录字符串找到距离总部 (0,0) 最远的合法坐标。我们分别使用了Java、C、Python和JavaScript四种语言实现了解决方案。

    下期见啦~🥰

  • 相关阅读:
    js onclick 父级 子节点 onclick 冲突 屏蔽 拦截
    想转行学软件测试担心哪些问题?
    vueelementui+tabs选项卡样式更改-内容待递增
    SpringCloud微服务项目实战 - 项目搭建
    使用Python爬虫和C++搭建离线IP库
    【C++】STL01-基本使用
    Asp.net MVC中文件夹中的控制器如何跳转到根目录的控制器中?
    【基本算法题-2022.7.30】9. 奇怪的汉诺塔
    pycharm更改远程服务器地址
    Plotjuggler之ulog格式分析
  • 原文地址:https://blog.csdn.net/weixin_36755535/article/details/139996510