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

news2024/10/7 16:25:59

目录

一、题目介绍

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<x<1000,0<y<1000。同时存在非法坐标,如(01,1)、(1,01),(0,100)属于非法坐标。
  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 详细代码

下面是具体实现代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CaveExploration {
    public static void main(String[] args) {
        String input = "ferga13fdsf3(100,200)f2r3rfasf(300,400)";
        System.out.println(findFarthestCoordinate(input));
    }

    public static String findFarthestCoordinate(String input) {
        // 定义正则表达式以提取合法的坐标
        Pattern pattern = Pattern.compile("\\((\\d{1,3}),(\\d{1,3})\\)");
        Matcher matcher = pattern.matcher(input);

        String farthestCoordinate = "(0,0)";
        int maxDistance = 0;

        while (matcher.find()) {
            String xStr = matcher.group(1);
            String yStr = matcher.group(2);
            int x = Integer.parseInt(xStr);
            int y = Integer.parseInt(yStr);

            // 检查坐标是否合法
            if (isValidCoordinate(xStr, yStr, x, y)) {
                int distance = x * x + y * y;
                if (distance > maxDistance) {
                    maxDistance = distance;
                    farthestCoordinate = "(" + x + "," + y + ")";
                }
            }
        }

        return farthestCoordinate;
    }

    // 验证坐标是否合法
    private static boolean isValidCoordinate(String xStr, String yStr, int x, int y) {
        return x > 0 && x < 1000 && y > 0 && y < 1000 &&
                !xStr.startsWith("0") && !yStr.startsWith("0");
    }
}

2.3 代码讲解:

1. 字符串解析

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

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

解析思路

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

2. 合法性验证

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

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

验证思路

  • 坐标 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 实现代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

// 判断是否是合法的坐标
int isValidCoordinate(char *xStr, char *yStr, int x, int y) {
    return x > 0 && x < 1000 && y > 0 && y < 1000 && 
           (xStr[0] != '0' || strlen(xStr) == 1) && 
           (yStr[0] != '0' || strlen(yStr) == 1);
}

int main() {
    char input[] = "ferga13fdsf3(100,200)f2r3rfasf(300,400)";
    char *ptr = input;
    char xStr[4], yStr[4];
    int maxDistance = 0;
    char farthestCoordinate[10] = "(0,0)";

    while ((ptr = strstr(ptr, "(")) != NULL) {
        if (sscanf(ptr, "(%3[0-9],%3[0-9])", xStr, yStr) == 2) {
            int x = atoi(xStr);
            int y = atoi(yStr);
            if (isValidCoordinate(xStr, yStr, x, y)) {
                int distance = x * x + y * y;
                if (distance > maxDistance) {
                    maxDistance = distance;
                    sprintf(farthestCoordinate, "(%d,%d)", x, y);
                }
            }
        }
        ptr++;
    }

    printf("%s\n", farthestCoordinate);
    return 0;
}

3.3 代码详解

1. 字符串解析

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

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

2.解析思路

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

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

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

验证思路

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

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

int distance = x * x + y * y;

计算思路

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

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

if (distance > maxDistance) {
    maxDistance = distance;
    sprintf(farthestCoordinate, "(%d,%d)", x, y);
}

思路

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

四、Python实现

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

4.1 实现步骤

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

4.2 代码实现

import re

def find_farthest_coordinate(data):
    # 定义正则表达式以提取合法的坐标
    pattern = re.compile(r'\((\d{1,3}),(\d{1,3})\)')
    matches = pattern.findall(data)
    
    max_distance = 0
    farthest_coordinate = "(0,0)"
    
    for match in matches:
        x_str, y_str = match
        x = int(x_str)
        y = int(y_str)
        
        # 检查坐标是否合法
        if is_valid_coordinate(x_str, y_str, x, y):
            distance = x * x + y * y
            if distance > max_distance:
                max_distance = distance
                farthest_coordinate = f"({x},{y})"
    
    return farthest_coordinate

def is_valid_coordinate(x_str, y_str, x, y):
    # 验证坐标是否合法
    return 0 < x < 1000 and 0 < y < 1000 and \
           not (x_str.startswith("0") and len(x_str) > 1) and \
           not (y_str.startswith("0") and len(y_str) > 1)

# 示例输入
input_data = "ferga13fdsf3(100,200)f2r3rfasf(300,400)"
print(find_farthest_coordinate(input_data))  # 输出: (300,400)

4.3 详细讲解

1. 字符串解析

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

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

解析思路

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

2. 合法性验证

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

def is_valid_coordinate(x_str, y_str, x, y):
    return 0 < x < 1000 and 0 < y < 1000 and \
           not (x_str.startswith("0") and len(x_str) > 1) and \
           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. 找出最远的坐标

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

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

思路

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

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

max_distance = 0
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 详细代码

function findFarthestCoordinate(data) {
    // 定义正则表达式以提取合法的坐标
    const pattern = /\((\d{1,3}),(\d{1,3})\)/g;
    let matches;
    let maxDistance = 0;
    let farthestCoordinate = "(0,0)";

    while ((matches = pattern.exec(data)) !== null) {
        const xStr = matches[1];
        const yStr = matches[2];
        const x = parseInt(xStr, 10);
        const y = parseInt(yStr, 10);

        // 检查坐标是否合法
        if (isValidCoordinate(xStr, yStr, x, y)) {
            const distance = x * x + y * y;
            if (distance > maxDistance) {
                maxDistance = distance;
                farthestCoordinate = `(${x},${y})`;
            }
        }
    }

    return farthestCoordinate;
}

// 验证坐标是否合法
function isValidCoordinate(xStr, yStr, x, y) {
    return x > 0 && x < 1000 && y > 0 && y < 1000 &&
           !(xStr.startsWith("0") && xStr.length > 1) &&
           !(yStr.startsWith("0") && yStr.length > 1);
}

// 示例输入
const inputData = "ferga13fdsf3(100,200)f2r3rfasf(300,400)";
console.log(findFarthestCoordinate(inputData));  // 输出: (300,400)

5.3详细讲解

1. 字符串解析

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

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

解析思路

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

2. 合法性验证

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

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

验证思路

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

3. 距离计算

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

const distance = x * x + y * y;

计算思路

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

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

if (distance > maxDistance) {
    maxDistance = distance;
    farthestCoordinate = `(${x},${y})`;
}

思路

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

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

let maxDistance = 0;
let farthestCoordinate = "(0,0)";

思路

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

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

六、总结

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

下期见啦~🥰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1866080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL之可扩展性(四)

可扩展性 向外扩展 分片?还是不分片&#xff1f; 这是一个问题&#xff0c;对吧&#xff1f;答案很简单:如非必要&#xff0c;尽量不分片。首先看是否能通过性能调优或者更好的应用或数据库设计来推迟分片。如果能足够长时间地推迟分片&#xff0c;也许可以直接购买更大地服…

Linux系统启动流程

init程序类型&#xff1a; ①、SysV&#xff1a;init&#xff0c;centos 5之前&#xff0c;配置文件/etc/init.d/ ②、Upstart: init&#xff0c;centos 6&#xff0c;配置文件/etc/init.d/ /etc/init/ ③、Systemd:Systemd&#xff0c;centos 7&#xff0c;配置文件/usr/li…

JavaScript的学习之自增自减

目录 一、自增 第一种&#xff1a;a 第二种&#xff1a;a 二、自减 一、自增 定义&#xff1a;可以是变量在自身的基础上增加1 自增分为两种&#xff1a;后&#xff08;a&#xff09;和前&#xff08;a&#xff09; 无论是a和a都会立即使原变量的值增1&#xff0c;不同的使…

windows10 无法识别双频合一的5Gwifi

windows10 无法识别双频合一的5Gwifi 在网络配置中指定 wireless mode 为802.11a 或802.11ac 这两个是 5G网络的协议&#xff0c;如果不存在则说明无线网卡不支持5G网络

1米全国土地覆盖数据如何切片

我们在《136G全国1m土地覆盖数据》一文中&#xff0c;为你分享了136G全国1米土地数据。 现在&#xff0c;再为你分享如何将该数据进行切片&#xff0c;并在水经微图&#xff08;简称“微图”&#xff09;中加载的方法。 数据加载 打开微图&#xff0c;点击左上角的图层&…

打印一张A4纸多少钱?打印a4多少钱一张

在数字化日益发展的今天&#xff0c;打印服务依然是办公、学习和生活中不可或缺的一部分。对于广大用户来说&#xff0c;了解A4纸打印的价格成为选择打印服务的重要参考因素。那么&#xff0c;A4纸打印到底多少钱一张呢&#xff1f; 在琢贝云打印平台&#xff0c;打印价格非常实…

固定翼无人机入门(二)

这里讲讲无人机的路径跟踪控制相关知识&#xff0c;路径跟踪需要制导率&#xff08;平面&#xff09;和控制器&#xff0c;在无人机中较为常用的是L1制导率&#xff0c;不过L1制导率是控制无人机在二维平面上的转向&#xff0c;此处还引入总能量控制&#xff0c;控制无人机的高…

onlyoffice官方文档中打开文件示例的相关测试

文档地址&#xff1a;https://api.onlyoffice.com/zh/editors/open 开发环境&#xff1a; 后端&#xff1a;zdppy_api开发的一个文档服务前端&#xff1a;vue3开发的客户端 我们在index.html中&#xff0c;引入了文档服务的js文件&#xff1a; <!doctype html> <h…

海外代理IP哪个可靠?如何测试代理的稳定性?

在数字化时代&#xff0c;互联网已成为我们日常生活的重要组成部分。然而&#xff0c;随着网络活动的增加&#xff0c;我们面临的安全威胁也随之增加。 黑客攻击、数据泄露、网络钓鱼等安全事件频发&#xff0c;严重威胁着我们的个人隐私和网络安全。代理服务器在当今的互联网世…

ansible自动化运维,(2)ansible-playbook

三种常见的数据格式&#xff1a; XML&#xff1a;可扩展标记语言&#xff0c;用于数据交换和配置 JSON&#xff1a;对象标记法&#xff0c;主要用来数据交换或配置&#xff0c;不支持注释 YAML&#xff1a;不是一种标记语言&#xff0c;主要用来配置&#xff0c;大小写敏感&…

3.任务的创建与删除

1.什么是任务&#xff1f; 任务可以理解为进程/线程&#xff0c;创建一个任务&#xff0c;就会在内存开辟一个空间。 任务通常都含有while(1)死循环 2.任务创建与删除相关的函数 3.CUBEMAX相关配置 编辑一个led1闪烁的任务

Python学习打卡:day16

day16 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 目录 day16116、SQL 基础和 DDLSQL的概述SQL语言的分类SQL的语法特征DDL — 库管理DDL — 表管理 117、SQL — DMLDML概述数据插入 INSERT数据删除 DEL…

flink输出中文乱码

flink输出中文乱码 &#xff08;1&#xff09;首先在/etc/profile.d/my_env.sh中加入下面这行数据 export LANGzh_CN.UTF-8&#xff08;2&#xff09;其次在flink配置文件中指定编码 [xxxhadoop102 flink-1.13.6]$ vim conf/flink-conf.yaml加入下面这行数据 env.java.opts:…

A股探底回升,跑出惊天大阳,你们知道为什么吗?

今天的A股&#xff0c;探底回升&#xff0c;让人惊呆了&#xff0c;你们知道是为什么吗&#xff1f;盘面上出现3个重要信号&#xff0c;一起来看看&#xff1a; 1、今天A股市场炸锅了&#xff0c;AI人工智能、国产软件、存储芯片迎来了涨停潮&#xff0c;惊呆了&#xff0c;科技…

【MySQL事务】深刻理解事务隔离以及MVCC

文章目录 什么叫事务事务的提交方式常见的事务操作方式事务的开始与回滚总结 事务的隔离设置隔离级别解释脏读解释幻读解释不可重复读为什么可重复读不能解决幻读问题&#xff1f;总结 数据库并发的场景MVCC隐藏列字段undo日志Read view RR和RC的本质区别总结 什么叫事务 在My…

游戏AI的创造思路-技术基础-sigmoid函数详解

在前面的机器学习和深度学习的内容中&#xff0c;大量出现了sigmoid函数&#xff0c;所以本篇为大家介绍下sigmoid函数&#xff0c;希望对大家理解前面的算法和后面的Transformer有所帮助 目录 3.8. sigmoid函数 3.8.1. 定义 3.8.2. 性质 3.8.3. 应用 3.8.4. 缺点 3.8.5.…

sd卡一插上就提示格式化是怎么回事?sd卡数据如何恢复?

sd卡一插上就提示格式化是怎么回事&#xff1f;里面的数据怎么办&#xff1f;下面小编总结了SD卡提示格式化的原因和对应解决办法分享给大家&#xff01; SD卡好好的&#xff0c;为什么一插电脑上就提示需要格式化呢&#xff1f;当SD卡提示格式化时&#xff0c;可以考虑下面几类…

VS Code 配置cmake(Linux环境)

通过sudo apt install cmake在linux上安装cmake 在Vs Code中安装这两个插件 通过命令whereis cmake获取linux中cmake的路径信息 右键CMake Tools右下角齿轮标志&#xff0c;选择扩展设置&#xff08;Extension Settings&#xff09; 注意要设置的是本地&#xff0c;还是远程连接…

【UE5.3】笔记3-静态网格体,BSP

静态网格体组件 主要有两个属性 一个是静态网格体&#xff1a;对应的也就是模型&#xff0c;比如fbx&#xff0c;maya&#xff0c;obj等格式 一个是材质&#xff1a;由各种贴图、渲染设置等&#xff0c;比如unity里的shader BSP画刷&#xff1a; 打开放置Actor选项卡&#…

SpringAOP执行流程——从源码画流程图

文章目录 了解ProxyFactory入门操作添加多个Advice的执行顺序关于异常Advice关于proceed()方法指定方法才进行增强逻辑 创建代理对象的其他方式ProxyFactoryBeanBeanNameAutoProxyCreatorDefaultAdvisorAutoProxyCreator 对SpringAOP的理解TargetSourceProxyFactory选择JDK/CJL…