• 华为OD机考算法题:最远足迹


    目录

    题目部分

    解读与分析

    代码实现


    题目部分

    题目最远足迹
    难度
    题目说明某探险队负责对地下洞穴进行探险。 探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。探索工作结束后,探险队需要获取到某成员在探险过程中相对于探险队总部的最远的足迹位置。
    1. 仪器记录坐标时,坐标的数据格式为(x,y),如(1,2)、(100,200),其中0如果 x = 0, y = 0 或者 x、y 值存在前导 0 (首位为 0),则认为坐标不合法。(笔者注)
    2. 设定探险队总部的坐标为(0,0),某位置相对总部的距离为:x * x+ y * y。
    3. 若两个座标的相对总部的距离相同,则第一次到达的坐标为最远的足迹。
    4. 若记录仪中的坐标都不合法,输出总部坐标(0,0)。
    备注:不需要考虑双层括号嵌套的情况,比如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. 首字母是'(',尾字母是')',中间是两个数字,用',' 隔开。
    2. 两个数字的首位都不能为 0(数字不能等于0,而且大于0的数字不能有前导 0)。 
    如果不存在合法坐标,则输出
    (0,0)

    本题题干关于坐标合法,没有明确的说,只能通过题目的样例总结。
    一个好的题目,应该使用概括的语言描述合法(或不合法)的情况,然后举例说明。否则,举例如果不能覆盖所有的场景,将会产生歧义。

    分析与思路

    先设置两个变量:
    1. maxPosition ,字符串类型,用以记录最远的坐标,初始值为 "(0,0)"。
    2. maxDistance,整形数字,记录最远的距离,初始值为0。

    遍历字符串,在遍历字符串的过程中,找到一个合法坐标后,计算其到总部的距离,设为 tmpDistance,如果 tmpDistance 大于 maxDistance,则把它赋值给 maxDistance,并把把它坐标赋值给 maxPosition。继续遍历字符串,寻找下一个合法坐标,循环判断到总部距离,直到字符串结束。

    在计算到总部的距离时,假设坐标为 (x,y) , 则距离为 sqrt( x * x + y * y )。由于此题只关心坐标的相对距离,不需要绝对值,所以可以使用 x * x + y * y 代替其平方根值进行比较,以减少计算量。

    代表合法坐标的字符串,在去除首位的小括号后必须满足如下条件:
    1. 中间某个位置(既不是首字母,也不是尾字母)包含字符','。
    2. 通过分隔符 ',' 分开为 2 个字符串,这两个字符串首字母不为 0,且都能解析成正整数。

    此算法只需要遍历一次字符串,时间复杂度为 O(n),使用了 2 个额外的原始数据类型变量,空间复杂度为 O(1)。


    代码实现

    Java代码

    1. import java.util.Scanner;
    2. /**
    3. * 最远足迹
    4. *
    5. * @since 2023.09.07
    6. * @version 0.1
    7. * @author Frank
    8. *
    9. */
    10. public class MaxDistance {
    11. public static void main(String[] args) {
    12. Scanner sc = new Scanner(System.in);
    13. String record = sc.nextLine();
    14. int i = 0;
    15. int maxDistance = 0;
    16. String maxPosition = "(0,0)";
    17. while (i < record.length()) {
    18. int leftPT = record.indexOf('(', i);
    19. int rightPT = record.indexOf(')', i);
    20. if (leftPT < 0) {
    21. break;
    22. }
    23. String position = record.substring(leftPT + 1, rightPT);
    24. int tmpDistance = getDistance(position);
    25. if (tmpDistance > maxDistance) {
    26. maxDistance = tmpDistance;
    27. maxPosition = "(" + position + ")";
    28. }
    29. i = rightPT + 1;
    30. }
    31. System.out.println(maxPosition);
    32. }
    33. private static int getDistance(String position) {
    34. int ret = 0;
    35. String[] posArr = position.split(",");
    36. if (posArr == null || posArr.length != 2) {
    37. return 0;
    38. }
    39. for (int i = 0; i < posArr.length; i++) {
    40. String strPos = posArr[i];
    41. if (strPos.length() == 0 || strPos.startsWith("0")) {
    42. return 0;
    43. }
    44. try {
    45. int intPos = Integer.parseInt(strPos);
    46. ret += (intPos * intPos);
    47. } catch (NumberFormatException e) {
    48. return 0;
    49. }
    50. }
    51. return ret;
    52. }
    53. }

    JavaScript代码

    1. const rl = require("readline").createInterface({ input: process.stdin });
    2. var iter = rl[Symbol.asyncIterator]();
    3. const readline = async () => (await iter.next()).value;
    4. function getDistance( position ) {
    5. var ret = 0;
    6. var posArr = position.split(",");
    7. if (posArr == null || posArr.length != 2) {
    8. return 0;
    9. }
    10. for (var i = 0; i < posArr.length; i++) {
    11. var strPos = posArr[i];
    12. if (strPos.length == 0 || strPos.startsWith("0")) {
    13. return 0;
    14. }
    15. var intPos = Number(strPos);
    16. if( Number.isNaN( intPos) )
    17. {
    18. return 0;
    19. }
    20. ret += (intPos * intPos);
    21. }
    22. return ret;
    23. }
    24. function processInput( line )
    25. {
    26. var record = line;
    27. var i = 0;
    28. var maxDistance = 0;
    29. var maxPosition = "(0,0)";
    30. if( !record )
    31. {
    32. console.log(maxPosition);
    33. return;
    34. }
    35. while (i < record.length) {
    36. var leftPT = record.indexOf('(', i);
    37. var rightPT = record.indexOf(')', i);
    38. if (leftPT < 0) {
    39. break;
    40. }
    41. var position = record.substring(leftPT + 1, rightPT);
    42. var tmpDistance = getDistance(position);
    43. if (tmpDistance > maxDistance) {
    44. maxDistance = tmpDistance;
    45. maxPosition = "(" + position + ")";
    46. }
    47. i = rightPT + 1;
    48. }
    49. console.log(maxPosition);
    50. }
    51. void async function() {
    52. let input = [];
    53. while (line = await readline()) {
    54. processInput( line );
    55. }
    56. }();

    (完)

  • 相关阅读:
    C#语言基础速成Day07
    弹指间计算机协会 X Five Pines Robomaster实验室 考核题面与题解
    Ultra-Light-Fast-Generic-Face-Detector-1MB-master人脸检测算法的复现过程记录
    机器学习(python)笔记整理
    springMVC
    秋招每日一题T10——峰会
    window系统 安装 nvm 详细步骤
    无人机UAV目标检测与跟踪(代码+数据)
    自动驾驶 知识点 Review 点云 感知算法 五(PointPillar,SECOND,RangeDet)
    PDF文件怎么转换成Word?这几种方法原来这么简单
  • 原文地址:https://blog.csdn.net/ZiJinShi/article/details/132734425