华为OD机试真题Java实现【最远足迹】真题+解题思路+代码(20222023)
迪丽瓦拉
2025-05-28 21:43:49
0

最远足迹

题目

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

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

🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Java)真题目录汇总

备注:

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

输入描述

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

如:

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

输出描述

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

如:

(300,400)

示例1

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

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

输出

(5,10)

说明

记录仪中的合法坐标有3个: (3,10), (3,4), (5,10),其中(5,10)是相距总部最远的坐标, 输出(5,10)。

示例2

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

asfefaweawfaw(0,1)fe

输出

(0,0)

说明

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

解题思路

  1. 创建 Scanner 对象并读入一行输入。
  2. 检查输入字符串是否为空或长度小于 1,如果是,则输出错误信息并退出程序。
  3. 定义 solve() 方法,该方法用于解决问题。在方法中,定义两个变量 right 和 left,以及两个 List 集合 myList 和 allLists。
  4. 遍历输入字符串的每个字符,如果该字符是左括号,则将 left 设置为当前下标加一;如果该字符是右括号,则将 right 设置为当前下标。
  5. 如果 right 不等于 0,则说明找到了一组符合条件的数对,对其进行处理,并将其添加到 myList 中,然后将 myList 添加到 allLists 中。然后将 left 和 right 重置为 0。
  6. 如果 allLists 集合中有元素,则对其中的所有元素按照其平方和大小进行排序,并输出第一个元素。
  7. 如果 allLists 集合中没有元素,则输出默认值 “(0,0)”。
  8. 在 main() 方法中调用 solve() 方法来解决问题。

本程序主要使用了以下集合和知识点:

  1. Scanner 类:用于从标准输入流中读取用户输入。
  2. List 集合:用于存储符合条件的数对和所有数对。程序中使用 ArrayList 实现 List。
  3. 字符串操作:用于截取子串和分割字符串。程序中使用 String.substring() 和 String.split() 方法。
  4. Lambda 表达式:用于对集合中的元素进行排序。程序中使用 Collections.sort() 方法和 Lambda 表达式。
  5. 异常处理:用 try-catch 语句捕获可能出现的异常并输出错误信息。

代码实现

package com.hw.od;import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** Author: 华为OD联盟(梦想橡皮擦,码莎拉蒂,鸿蒙坚果) Date: 2023/1/6 Time: 19:38 Description:*/public class OdMain {public static void sovle(String inputValue) {int right = 0;int left = 0;List myList = new ArrayList<>();List> allLists = new ArrayList<>();for (int i = 0; i < inputValue.length(); ++i) {if (inputValue.charAt(i) == '(') {left = i + 1;} else if (inputValue.charAt(i) == ')') {right = i;}if (0 != right) {String[] subStr = inputValue.substring(left, right).split(",");int a = Integer.parseInt(subStr[0]);int b = Integer.parseInt(subStr[1]);if (subStr[0].charAt(0) != '0' && subStr[1].charAt(0) != '0' && a > 0 && a < 1000 && b > 0 && b < 1000) {myList.add(a);myList.add(b);allLists.add(myList);myList = new ArrayList<>();}left = right = 0;}}if (allLists.size() != 0) {allLists.sort((i, j) -> {int ax = i.get(0) * i.get(0) + i.get(1) * i.get(1);int bx = j.get(0) * j.get(0) + j.get(1) * j.get(1);if (bx >= ax) {return 1;}return -1;});System.out.println("(" + allLists.get(0).get(0) + "," + allLists.get(0).get(1) + ")");} else {System.out.println("(0,0)");}}public static void main(String[] args) {try {Scanner scan = new Scanner(System.in);String inputValue = scan.nextLine();if (inputValue == null || inputValue.length() < 1) {System.out.println("input error");return;}sovle(inputValue);} catch (Exception e) {e.printStackTrace();System.out.println("input error");}}
}

代码运行结果

ferg(3,10)a13fdsf3(3,4)f2r3rfasf(5,10)
(5,10)xxxxxxxxxx ferg(3,10)a13fdsf3(3,4)f2r3rfasf(5,10)(5,10)51 2 52

版权说明

试题来源:华为 OD 联盟整理收集

题解:解题思路代码 为原创内容,该部分版权由 OD 联盟共同拥有,并授权组内成员发布。

目标:👉 助你解开所有JAVA华为OD机试题


🔥系列专栏

  • 华为OD机试(JAVA)真题目录汇总
  • 华为OD机试(Python)真题目录汇总
  • 华为OD机试(C++)真题目录汇总
  • 华为OD机试(JavaScript)真题目录汇总

相关内容