华为OD机试 - 最远足迹(2022Q4 100分)

目录

华为OD机试 2023B卷题库疯狂收录中,刷题++点这里++

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

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

备注:

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

二、输入描述

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

三、输出描述

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

如: (10,20)

  • 输入:asdf(7,8)qwertjh45(5,7)fa65jhsdf23fg(6,8)
  • 输出:(7,8)

四、解题思路

  1. 读取输入的字符串;
  2. 定义变量 r 和 l,分别表示括号的右边界和左边界;
  3. 定义一个列表 list 存储合法的坐标;
  4. 定义一个二维列表 lists 存储所有合法的坐标;
  5. 遍历字符串,当遇到左括号时,记录左边界 l 的位置;当遇到右括号时,记录右边界 r 的位置;
  6. 如果左右边界都不为零,则表示找到了一个合法的坐标,将其提取出来并判断是否合法;
  7. 如果坐标合法,则将其加入到 list 中,并将 list 加入到 lists 中;
  8. 重置左右边界 l 和 r;
  9. 判断 lists 的长度,如果为零,则输出总部坐标 (0,0);否则,根据坐标的相对距离排序 lists,取第一个坐标作为最远足迹的位置;
  10. 输出最终结果。

五、Java算法源码

java 复制代码
public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);

    String s = sc.nextLine();
    
    // 定义变量 r 和 l,分别表示括号的右边界和左边界
    int r = 0;
    int l = 0;

	// 定义一个列表 list 存储合法的坐标
    List<Integer> list = new ArrayList<>();
    // 定义一个二维列表 lists 存储所有合法的坐标
    List<List<Integer>> lists = new ArrayList<>();

	// 遍历字符串,当遇到左括号时,记录左边界 l 的位置;
    for (int i = 0; i < s.length(); i++) {
    	// 当遇到右括号时,记录右边界 r 的位置
        if (s.charAt(i) == '(') {
            l = i + 1;
            // 当遇到右括号时,记录右边界 r 的位置
        } 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]);
            
            // 如果坐标合法,则将其加入到 list 中,并将 list 加入到 lists 中
            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
            l = r = 0;
        }
    }

	//  判断 lists 的长度,如果为零,则输出总部坐标 (0,0)
    if (lists.size() == 0) {
        System.out.println("(0,0)");
    } else {
    	// 根据坐标的相对距离排序 lists,取第一个坐标作为最远足迹的位置
        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机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

相关推荐
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei2 小时前
java的类加载机制的学习
java·学习
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7894 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java5 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~5 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
dsywws5 小时前
Linux学习笔记之vim入门
linux·笔记·学习