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

这篇具有很好参考价值的文章主要介绍了华为OD机考算法题:最远足迹。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

题目部分

解读与分析

代码实现


题目部分

题目 最远足迹
难度
题目说明 某探险队负责对地下洞穴进行探险。 探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。探索工作结束后,探险队需要获取到某成员在探险过程中相对于探险队总部的最远的足迹位置。
1. 仪器记录坐标时,坐标的数据格式为(x,y),如(1,2)、(100,200),其中0<x<1000,0<y<1000。同时存在非法坐标,如(01,1)、(1,01),(0,100)属于非法坐标。
如果 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代码

import java.util.Scanner;

/**
 * 最远足迹
 * 
 * @since 2023.09.07
 * @version 0.1
 * @author Frank
 *
 */
public class MaxDistance {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String record = sc.nextLine();

		int i = 0;
		int maxDistance = 0;
		String maxPosition = "(0,0)";
		while (i < record.length()) {
			int leftPT = record.indexOf('(', i);
			int rightPT = record.indexOf(')', i);

			if (leftPT < 0) {
				break;
			}

			String position = record.substring(leftPT + 1, rightPT);
			int tmpDistance = getDistance(position);
			if (tmpDistance > maxDistance) {
				maxDistance = tmpDistance;
				maxPosition = "(" + position + ")";
			}
			i = rightPT + 1;
		}
		System.out.println(maxPosition);
	}

	private static int getDistance(String position) {
		int ret = 0;
		String[] posArr = position.split(",");
		if (posArr == null || posArr.length != 2) {
			return 0;
		}
		for (int i = 0; i < posArr.length; i++) {
			String strPos = posArr[i];
			if (strPos.length() == 0 || strPos.startsWith("0")) {
				return 0;
			}
			try {
				int intPos = Integer.parseInt(strPos);
				ret += (intPos * intPos);
			} catch (NumberFormatException e) {
				return 0;
			}

		}

		return ret;
	}

}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

function getDistance( position ) {
    var ret = 0;
    var posArr = position.split(",");
    if (posArr == null || posArr.length != 2) {
        return 0;
    }
    for (var i = 0; i < posArr.length; i++) {
        var strPos = posArr[i];
        if (strPos.length == 0 || strPos.startsWith("0")) {
            return 0;
        }
        var intPos = Number(strPos);
        if( Number.isNaN( intPos) )
        {
            return 0;
        }
        ret += (intPos * intPos);

    }

    return ret;
}

function processInput( line )
{
    var record = line;
    var i = 0;
    var maxDistance = 0;
    var maxPosition = "(0,0)";
    if( !record )
    {
        console.log(maxPosition);
        return;
    }
    while (i < record.length) {
        var leftPT = record.indexOf('(', i);
        var rightPT = record.indexOf(')', i);

        if (leftPT < 0) {
            break;
        }

        var position = record.substring(leftPT + 1, rightPT);
        var tmpDistance = getDistance(position);
        if (tmpDistance > maxDistance) {
            maxDistance = tmpDistance;
            maxPosition = "(" + position + ")";
        }
        i = rightPT + 1;
    }
    console.log(maxPosition);
}

void async function() {
    let input = [];
    while (line = await readline()) {
        processInput( line );
    }

}();

(完)文章来源地址https://www.toymoban.com/news/detail-701509.html

到了这里,关于华为OD机考算法题:最远足迹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华为OD机考算法题:高效的任务规划

    题目 高效的任务规划 难度 难 题目说明 你有 n 台机器编号为  1 ~ n ,每台都需要完成一项工作, 机器经过配置后都能独立完成一项工作。 假设第  i  台机器你需要花  分钟进行设置, 然后开始运行,   分钟后完成任务。 现在,你需要选择布置工作的顺序,使得用最短的

    2024年02月07日
    浏览(33)
  • 华为OD机考算法题:区块链文件转储系统

    题目部分 解读与分析 代码实现 题目 区块链文件转储系统 难度 难 题目说明 区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1、F2……Fn。随着时间的推移,所占存储会越来越大。 云平台考虑将区块链按文件转储到廉价的SATA盘,只

    2024年02月08日
    浏览(36)
  • 华为OD机考算法题:MVP争夺战

    题目部分 解读与分析 代码实现 题目 MVP争夺战 难度 易 题目说明 在星球争霸篮球赛对抗赛中,强大的宇宙战队,希望每个人都能拿到MVP。 MVP的条件是,单场最高分得分获得者,可以并列,所以宇宙战队决定在比赛中,尽可能让更多的队员上场,且让所有有得分的队员得分都

    2024年02月09日
    浏览(33)
  • 华为OD机考算法题:数字加减游戏

    题目部分 解读与分析 代码实现 题目 数字加减游戏 难度 难 题目说明 小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字 s 变成数字 t 。 每个回合,小明可以用当前的数字加上或减去一个数字。 现在有两种数字可以用来加减,分别为 a, b (a≠b),其中 b 没有使用

    2024年02月09日
    浏览(39)
  • 华为OD机考算法题:阿里巴巴找黄金宝箱(1)

    题目 阿里巴巴找黄金宝箱(1) 难度 易 题目说明 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从 0 ~ N 的箱子,每个箱子上面贴有一个数字,箱子中可能有一个黄金宝箱。 黄金宝箱满足排在它之前的所有箱子数字和等于排在它之

    2024年02月07日
    浏览(45)
  • 华为OD机考算法题:根据某条件聚类最少交换次数

    题目部分 解读与思路 代码实现 题目 根据某条件聚类最少交换次数 难度 难 题目说明 给出数字K,请输出所有结果小于K的整数组合到一起的最少交换次数。 组合一起是指满足条件的数字相邻,不要求相邻后在数组中的位置。 数据范围 -100 =K = 100 -100 = 数组中数值 = 100 输入描

    2024年02月09日
    浏览(36)
  • 【华为OD机试真题 C语言】152、积木最远距离 | 机试真题+思路参考+代码解析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习 🎃题目描述

    2024年02月13日
    浏览(47)
  • 【华为OD机考 统一考试机试C卷】特殊的加密算法(C++ Java JavaScript Python C语言)

    真题目录:华为OD机考机试 真题目录( D卷 +C卷 + B卷 + A卷) + 考点说明 在线OJ:点击立即刷题,模拟真实机考环境 华为OD面试真题精选:华为OD面试真题精选 有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。 规则如下: 明文为一段

    2024年04月16日
    浏览(45)
  • 华为OD机考--【磁盘容量排序】

    ■  题目描述 【磁盘容量排序】 磁盘的容量单位常用的有M,G,T这三个等级,它们之间的换算关系为1T = 1024G,1G = 1024M,现在给定n块磁盘的容量, 请对它们按从小到大的顺序进行稳定排序,例如给定5块盘的容量,1T,20M,3G,10G6T,3M12G9M排序后的结果为20M,3G,3M12G9M,1T,

    2024年02月14日
    浏览(39)
  • 【华为OD机考 统一考试机试C卷】素数之积/RSA加密算法(C++ Java JavaScript Python C语言)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年03月21日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包