华为OD机试2024年真题( 最远足迹)
最远足迹(100分)
某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。探索工作结束后,探险队需要获取到某成员在探险过程中相对于探险队总部的最近的足迹位置。
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)。
备注:不需要考虑双层括号嵌套的情况,比如slsdfsd((1,2))。
>>输入描述
字符串,表示记录仪中的数据。
如:ferga13fdsf3(100,200)12r3rfasf(300,400)
>>输出描述
字符串,表示最远足迹到达的坐标。
如:(300,400)
>>示例1
输入
ferg(3,10)a13fdsf3(3,4)f2r3rfast(5,10)
输出(5,10)
说明
记录仪中的合法坐标有3个:(3,10),(3,4),(5,10),其中(5,10)是相距总部最远的坐标,输出(5,10)。
>>示例2
输入
astefaweawfaw(0,1)fe输出
(0,0)
思路:
是从给定的字符串中提取一组坐标,计算每个坐标点与原点 (0, 0) 的欧氏距离平方,并返回距离最大的有效坐标。
输入:输入是一行包含若干坐标的字符串,每个坐标的格式为 (row,col),row 和 col 是整数。
输出:返回与原点 (0, 0) 距离最大的坐标,输出格式为字符串 "(row,col)"。
有效坐标判断条件:坐标的行和列必须大于0且小于1000,且不能包含 '0' 为开头的行或列。
步骤:
1.读取输入字符串,逐字符处理,提取坐标。
2.过滤掉无效的坐标。
3.计算每个有效坐标与原点 (0, 0) 的欧氏距离平方,并记录距离最大的坐标。
4.输出结果。
代码段如下:
package com.rich.huawei.od_test;import java.util.Scanner;/*** @description* @Title Test01* @Author tang rui qi* @Date 2024/10/14 5:17*/
public class Test01 {public static void main(String[] args) {Scanner input = new Scanner(System.in);String resStr = "(0,0)"; // 保存结果坐标,初始为原点String word = input.nextLine(); // 从输入中读取一行字符串int size = word.length(); // 字符串长度int temDis = 0, index = 0; // temDis用于存储当前最大的距离平方,index用于标记当前坐标的起始位置resStr = func(size, index, temDis, word, resStr); // 调用函数计算结果System.out.println(resStr); // 输出距离最大的坐标}// func函数用于遍历字符串并计算有效坐标的距离private static String func(int size, int index, int temDis, String word, String resStr) {// 遍历输入字符串,提取坐标并计算距离for (int u = 0; u < size; u += 1) {if ('(' == word.charAt(u)) { // 如果遇到'(',标记坐标起始位置index = u + 1;} else if (word.charAt(u) == ')') { // 如果遇到')',提取并处理坐标String[] matrix = word.substring(index, u).split(","); // 提取坐标字符串,按','分割int row = Integer.parseInt(matrix[0]), col = Integer.parseInt(matrix[1]); // 解析行和列// 无效坐标过滤条件if (matrix[0].charAt(0) == '0') {continue; // 行数以'0'开头则跳过}if (matrix[1].charAt(0) == '0') {continue; // 列数以'0'开头则跳过}if (row <= 0 || row >= 1000) {continue; // 行数超出范围则跳过}if (col <= 0 || col >= 1000) {continue; // 列数超出范围则跳过}// 计算当前坐标与原点(0,0)的距离平方int dis = row * row + col * col;// 更新最大距离和对应的坐标if (temDis < dis) {resStr = "(" + row + "," + col + ")"; // 更新结果坐标temDis = dis; // 更新最大距离}}}return resStr; // 返回距离最大的坐标}}