一、题目描述
某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。探索工作结束后,探险队需要获取到某成员在探险过程中相对于探险队总部的最远的足迹位置。
- 仪器记录坐标时,坐标的数据格式为(x,y),如(1,2)、(100,200),其中
0<x<1000
,0<y<1000
。同时存在非法坐标,如(01,1)、(1,01),(0,100)
属于非法坐标; - 设定探险队总部的坐标为(0,0),某位置相对总部的距离为:
x*x+y*y
; - 若两个座标的相对总部的距离相同,则第一次到达的坐标为最远的足迹;
- 若记录仪中的坐标都不合法,输出总部坐标(0,0)。
备注:
不需要考虑双层括号嵌套的情况,比如sfsdfsd((1,2))
。
二、输入描述
字符串,表示记录仪中的数据。
三、输出描述
字符串,表示最远足迹到达的坐标。
如: (10,20)
- 输入:
asdf(7,8)qwertjh45(5,7)fa65jhsdf23fg(6,8)
- 输出:
(7,8)
四、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int r = 0;
int l = 0;
List<Integer> list = new ArrayList<>();
List<List<Integer>> lists = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
l = i + 1;
} else if (s.charAt(i) == ')') {
r = i;
}
if (r != 0) {
String[] ss = s.substring(l, r).split(",");
int j = Integer.parseInt(ss[0]);
int w = Integer.parseInt(ss[1]);
if (j > 0 && j < 1000 && w > 0 && w < 1000 && ss[0].charAt(0) != '0' && ss[1].charAt(0) != '0') {
list.add(j);
list.add(w);
lists.add(list);
list = new ArrayList<>();
}
l = r = 0;
}
}
if (lists.size() == 0) {
System.out.println("(0,0)");
} else {
lists.sort((a, b) -> {
int ax = a.get(0) * a.get(0) + a.get(1) * a.get(1);
int bx = b.get(0) * b.get(0) + b.get(1) * b.get(1);
if (bx >= ax) {
return 1;
}
return -1;
});
System.out.println("(" + lists.get(0).get(0) + "," + lists.get(0).get(1) + ")");
}
}
五、效果展示
🏆本文收录于,华为OD机试2023(Java)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。