华为od机试题目回顾

news2024/12/19 22:07:56

今天去做了华为机试,两道一星题,一道二星题。
一星题 1:
题目主要大意:
输入一串字符串,里面可能包含有(x,y)的坐标。

  1. 0<x<1000,0<y<1000,类似(01,1)、(1,01)、(0,100)的都是非法坐标,如果字符串中找不到坐标的话返回(0,0)。
  2. 如果找到坐标,计算坐标 x*x+y*y的最大值,相同最大值返回第一个(x,y)。
  3. 不会有括号嵌套,类似asdasf((1,2))不会出现。

样例:
输入:dasd(1,2)ghdfg(3,5)ghbkk(5,10)
输出:(5,10)

输入:dasd(01,2)
输出:(0,0)

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
            String str = in.nextLine();
            int start = str.indexOf("(");
            int end = str.indexOf(")");
            int lastEnd = str.lastIndexOf(")");
            if (start == -1){
                System.out.println("(0,0)");
                break;
            }
            ArrayList<MyNode> list = new ArrayList<>();
            //1.查找并过滤数据
            while (end !=-1){
            	//找到 x,y 格式数据
                String temp = str.substring(start+1,end);
                if (temp.length() != 0){
                    String[] split = temp.split(",");
                    if (split.length == 2){
                        String x = split[0]; //x
                        String y = split[1]; //y
                        int ok_x = isOK(x); //判断x是否合法,并返回合法数字
                        int ok_y = isOK(y);	//同上判断y
                        if (ok_x > 0 && ok_y > 0){ //x和y都合法
                            MyNode node = new MyNode();
                            node.x = ok_x;
                            node.y = ok_y;
                            node.far = node.x * node.x + node.y * node.y;
                            list.add(node);
                        }
                    }
                }
                //字符串更新
                str = str.substring(end+1);
                start = str.indexOf("(");
                end = str.indexOf(")");
                lastEnd = str.lastIndexOf(")");
                if (end == lastEnd) ++lastEnd;
            }

            //2.获取远距离坐标
            int max=0;
            int maxIndex=-1; //最大值第一次出现时的坐标
            for(int i = 0; i < list.size(); i++){
                MyNode myNode = list.get(i);
                if (myNode.far > max){
                    max = myNode.far;
                    maxIndex = i;
                }
            }
            if (maxIndex==-1){
                System.out.println("(0,0)");
                break;
            }
            MyNode mn = list.get(maxIndex);
            System.out.println("("+mn.x+","+mn.y+")");
        }
    }
	//传入的坐标x或者y是否符合0<s<1000,返回合法数字。
    public  static int isOK(String s){
        if (s==null || s.length() <= 0) return -1;
        char[] ch = s.toCharArray();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < ch.length; i++) {
            if(ch[0]=='0') return -1;
            //下面这句是预防输入为:类似((1,2)时传入的x=(1,y=2,做过滤
            if(ch[i]=='(' || ch[i] == ')') continue;
            if (!(ch[i] >= '0' && ch[i] <= '9')){
                return -1;
            }
            sb.append(ch[i]);
        }
        Integer num = Integer.valueOf(sb.toString());
        if(num > 0 && num < 1000) return num;
        return -1;
    }
}
class MyNode{
    int x;
    int y;
    int far;
}

上面的代码是100%通过了测试,43ms。
思路也很简单:

  1. 先从字符串里面找到所有正确的(x,y)并套用公式计算,用个对象类接收,再放入list中。
  2. list便利找到公式计算最大值,和最大值第一次出现的坐标,然后输出。

一星题 2:
题目大意:输入一组数字,用空格隔开,构建成完全二叉树。然后找出非叶子节点,以后序遍历方式输出。
当时没做出来,人懵逼了,不知道怎么构建一颗完全二叉树,尝试了差不多20-30分钟左右放弃了。
例子:
在这里插入图片描述
下午的时候百度怎么用Java构建完全二叉树,然后才做出来。
解决思路:

  1. 输入的字符串通过split(" ")分割成数组,可以转int,也可以直接用String。
  2. 构建完全二叉树
  3. 后序遍历时,加个判断只有当前节点的左子树不为空时才输出当前节点的值
import java.util.*;

public class Main {
    public static void main(String[] args) {
        int arr[] = {1,2,3,4,5,6,7,8,9,10,11,12};
        //int arr1[] = {1, 2, 3, 4, 5, 6};
        TestBinTree btree = new TestBinTree();

        Node root = btree.initBinTree(arr);

        Queue nodeQueue = new ArrayDeque<>();
        //btree.afterTrival(root);
        System.out.println("");
        btree.afterTrival1(root);
        //System.out.println("我们测试结果:");

        //System.out.println("层序遍历:");

        //btree.trivalBinTree(root, nodeQueue);
        /*
        System.out.println("\n先序遍历:");

        btree.preTrival(root);

        System.out.println("\n中序遍历:");

        btree.midTrival(root);

        System.out.println("\n后序遍历:");

        btree.afterTrival(root);*/

    }
}

/**
 * 定义二叉树节点元素
 *
 * 
 */

class Node {

    public Node leftchild;

    public Node rightchild;

    public int data;

    public Node(int data) {
        this.data = data;
    }
}


class TestBinTree {

    /**
     * 将一个arry数组构建成一个完全二叉树
     *
     * @param arr 需要构建的数组
     * @return 二叉树的根节点
     */

    public Node initBinTree(int[] arr) {
        if (arr.length == 1) {
            return new Node(arr[0]);
        }

        List<Node> nodeList = new ArrayList<>();

        for (int i = 0; i < arr.length; i++) {
            nodeList.add(new Node(arr[i]));
        }

        int temp = 0;

        while (temp <= (arr.length - 2) / 2) { //注意这里,数组的下标是从零开始的

            if (2 * temp + 1 < arr.length)
                nodeList.get(temp).leftchild = nodeList.get(2 * temp + 1);

            if (2 * temp + 2 < arr.length)
                nodeList.get(temp).rightchild = nodeList.get(2 * temp + 2);
            
            temp++;
        }
        return nodeList.get(0);
    }

    /**
     * 层序遍历二叉树
     *
     * @param root      二叉树根节点
     * @param nodeQueue ,用到的队列数据结构
     */
    public void trivalBinTree(Node root, Queue<Node> nodeQueue) {
        nodeQueue.add(root);
        Node temp = null;

        while ((temp = nodeQueue.poll()) != null) {
            System.out.print(temp.data + " ");

            if (temp.leftchild != null) {
                nodeQueue.add(temp.leftchild);
            }

            if (temp.rightchild != null) {
                nodeQueue.add(temp.rightchild);
            }
        }
    }

    /**
     * 先序遍历
     *
     * @param root 二叉树根节点
     */
    public void preTrival(Node root) {
        if (root == null) {
            return;
        }
        System.out.print(root.data + " ");
        preTrival(root.leftchild);
        preTrival(root.rightchild);
    }

    /**
     * 中序遍历
     *
     * @param root 二叉树根节点
     */
    public void midTrival(Node root) {
        if (root == null) {
            return;
        }
        midTrival(root.leftchild);
        System.out.print(root.data + " ");
        midTrival(root.rightchild);
    }

    /**
     * 后序遍历
     *
     * @param root 二叉树根节点
     */
    public void afterTrival(Node root) {
        if (root == null) {
            return;
        }
        afterTrival(root.leftchild);
        afterTrival(root.rightchild);
        System.out.print(root.data + " ");
    }
    //这个就是后序遍历改造,剔除掉叶子节点,只保留非叶子节点的后序遍历
    public void afterTrival1(Node root) {
        if (root == null) {
            return;
        }
        afterTrival1(root.leftchild);
        afterTrival1(root.rightchild);
        if(root.leftchild!=null){
            System.out.print(root.data + " ");
        }
    }
}

上面代码测试输出结果:
在这里插入图片描述

上面这套代码可以继续改造Node成泛型T,适配不同的数据类型。

二星题:
题目大意:

  1. 第一行输入n,m,k,0<n,m<100,表示n ✖️ m的地图中,可活动区域中含有最多k个敌人。
  2. 剩下的每行输入一串字符串,字符串中#表示墙壁,.表示可活动区域(可上下左右走),E表示敌人。
  3. 找出敌人数量小于k的可活动范围数量

例子:

输入:
3 5 2
..#EE
E.#E.
###..

输出:1
说明:在3✖️5的地图中,可活动区域范围最多2个敌人,需要计算可活动范围中敌人数量小于2的范围数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/612442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java开发手册中为什么不建议在for循环中使用“+“进行字符串操作

场景 java开发手册中对于循环体中进行字符串的拼接要求如下&#xff1a; 【推荐】循环体内&#xff0c;字符串的连接方式&#xff0c;使用 StringBuilder 的 append 方法进行扩展。 说明&#xff1a;下例中&#xff0c;反编译出的字节码文件显示每次循环都会 new 出一个 Str…

【Linux】-自动化构建工具(make/makefile)

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言 前言 今天我们来讲讲再Linux中开发必备的一项技能&#xff0c;没有这个…

【OpenMMLab AI实战营第二期】深度学习预训练与MMPretrain

深度学习预训练与MMPretrain MMPreTrain 算法库介绍 MMPretrain 是一个全新升级的预训练开源算法框架&#xff0c;旨在提供各种强大的预训练主干网络&#xff0c; 并支持了不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassification 和 MMSelfSup&#xff0c;并开发…

项目干系人管理实用方法,让你的项目顺风顺水

项目管理中的干系人是每个项目的一个重要方面&#xff0c;因为项目的结果取决于他们。然而&#xff0c;管理各种各样的干系人的艺术很有挑战性。在项目管理中根本没有出错的余地&#xff0c;本文将带你了解项目干系人以及如何管理他们以促进项目的全面成功。 谁是项目管理的干…

第3章:SpringMVC获取请求参数

一、SpringMVC获取请求参数 1.通过servletAPI获取 将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象 <a th:href"{/testServletAPI(usernameadmin,password123456)}">测试API<…

MCGS昆仑通态触摸屏导入博途自定义数据类型和DB块变量的具体方法演示

MCGS昆仑通态触摸屏导入博途自定义数据类型和DB块变量的具体方法演示 如下图所示,在博途中新建项目后,添加自己所需的数据类型,然后选中该数据类型,右击选择“从块生成源“—”仅所选块“, 如下图所示,设置文件名后点击保存, 如下图所示,选中需要导出的DB块,右击选…

人事项目开发记录-登录模块

人事项目开发记录 后端接口实现 后端接口实现 后端权限认证采用Spring Security实现&#xff08;本小节中大量知识点与第10章的内容相关&#xff0c;需要读者熟练掌握第10章的内容&#xff09;&#xff0c;数据库访问使用MyBatis&#xff0c;同时使用Redis实现认证信息缓存。因…

如何在Centos的SSH2终端中终止-停止-结束某个Python程序的运行?

python3 /opt/python_scripts/retr/P-0006.py &我在运行上面的命令后&#xff0c;得到了下面的提示&#xff1a; [1] 42335 如果我想终止这个我自己写的Python程序&#xff0c;该怎么做呢&#xff1f; 答&#xff1a; 当您在后台运行一个命令时&#xff0c;终端会显示类似…

Django中使用openldap实现账号的统一管理

了解和安装 ldap ldap介绍 LDAP&#xff08;Lightweight Directory Access Protocol&#xff09;是一种轻量级的目录访问协议&#xff0c;它用于访问和维护分布式目录服务。 LDAP最初设计用于提供对X.500目录服务的简化访问&#xff0c;后来被广泛应用于各种应用程序和系统中…

SpringBoot源码分析:SpringBoot整合Tomcat(三)

一、概述 SpringBoot整合Tomcat整体启动流程如下图&#xff0c;接下来我们就按照改流程分析SpringBoot中内嵌Tomcat的启动流程。 二、启动流程 通过AbstractApplicationContext.refresh方法进入AbstractApplicationContext.onRefresh方法。 之后进入子类ServletWebServerAppl…

Word控件Spire.Doc 【其他】教程(6):从 Word 中提取 OLE 对象

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

chatgpt赋能python:Python后退命令:如何让你的程序退回到之前的状态

Python后退命令&#xff1a;如何让你的程序退回到之前的状态 Python是一种高级编程语言&#xff0c;因其易读易懂而闻名于世。Python中有很多命令用于编写程序&#xff0c;其中一项重要的命令是后退命令。本文将介绍Python后退命令的使用方法&#xff0c;并为您提供详细的步骤…

ChatGPT热度不减!华为宣布入局,盘古GPT能否大杀四方!

ChatGPT热度不减 六月份了&#xff0c;朋友们&#xff0c;来到六月份了已经&#xff0c;ChatGPT的热度依旧不减&#xff0c;各大论坛网站的榜单上还飘着ChatGPT相关话题的文章&#xff0c;且排名靠前。由此可见&#xff0c;这ChatGPT这股子热潮还得持续一段时间呢。 而且ChatG…

cuda block grid等介绍

这里写目录标题 cuda层次结构程序架构层次结构cuda程序调用cuda 内置变量GPU内存模型内存结构 可编程内存内存作用域寄存器本地内存共享内存共享内存访问冲突常量内存全局内存gpu缓存 cuda层次结构 程序架构 申请内存时是线性的内存&#xff0c;需要知道是按行还是按列排列 设计…

【Linux】Linux内核编译与入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Linux内核编译。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&am…

DM数据库TEXT类型字段查询返回时的问题

一、问题描述&#xff1a; 在项目中使用到了DM数据库连接&#xff0c;查询某些数据&#xff0c;然后以Map形式返回时TEXT类型是会出现一些问题&#xff0c;默认会转换为dm.jdbc.driver.DmdbNClob类型的对象&#xff0c;某些情况下&#xff08;不知道具体原因&#xff09;在JSON…

移动端布局之flex布局1:flex布局体验、flex布局原理、flex布局父项常见属性

移动端布局之flex布局1 flex布局体验传统布局和flex弹性布局的区别初体验index.html flex布局原理布局原理 flex布局父项常见属性常见父项属性flex-direction设置主轴的方向&#xff08;重要&#xff09;主轴与侧轴属性值flex-direction: row;flex-direction: row-reverse;flex…

笔试强训9

作者&#xff1a;爱塔居 专栏&#xff1a;笔试强训 文章简介&#xff1a;简单记录学习的细碎~ day15 一. 单选 1.给出数据表 score(stu-id,name,math,english,Chinese), 下列语句正确的是&#xff08; &#xff09; A Select sum(math),avg(chinese) from score B Select *,s…

麒麟V10防火墙,VNC,YUM源, nfs ,磁盘格式化

麒麟V10防火墙&#xff0c;VNC&#xff0c;YUM源&#xff0c; nfs &#xff0c;磁盘格式化 麒麟V10开启防火墙并设置开机自启 启动&#xff1a; systemctl start firewalld 关闭&#xff1a; systemctl stop firewalld 查看状态&#xff1a; systemctl status firewalld 开机禁…

2023年Q1电商平台饮料行业数据分析报告

我国的饮料市场非常庞大&#xff0c;从碳酸饮料到茶饮料&#xff0c;从功能性饮料到水&#xff0c;各个品类都有广泛的消费者基础。加之如今饮料消费场景不断延伸&#xff0c;家庭囤货、户外即饮、运动健身等成为消费者饮料需求的新场景&#xff0c;新需求带动线上饮料市场持续…