华为OD机试题

这篇博客回顾了华为OD机试中的一道题目,涉及使用Java来实现根据树形结构和坐标查找节点内容。题目提供了一个树的节点表示方式和查询坐标,要求在给定的树结构中找到对应坐标的内容值。示例中,通过坐标(1,1)查询到了内容值为23的节点。" 130688084,14629956,考研复习时间管理:如何高效制定学习计划,"['考研', '学习方法', '时间管理', '复习策略']
摘要由CSDN通过智能技术生成

华为OD机试题回顾
华为OD 机试题(Java实现)
小镇做题家,做题记录,微信:yatesKumi

已知树形结构的所有节点信息,现要求根据输入坐标(x,y)找到该节点保存的内容值,其中x表示节点所在的层数,

根节点位于第0层,根节点的子节点位于第1层,依此类推,

y表示节点在该层内的相对偏移,从左至右,第一个节点偏移0,第二个节点偏移1,依此类推,

举例:上图中,假定圆圈内的数字表示节点保存的内容值,则根据坐标(1,1)查到的内容值是23。

输入描述:

每个节点以一维数组(int[])表示,所有节点信息构成二维数组(int[][]),二维数组的0位置存放根节点;

表示单节点的一维数组中,0位置保存内容值,后续位置保存子节点在二维数组中的索引位置。

对于上图中,根节点的可以表示为{10,1,2},树的整体表示为

{{10,1,2},{-21,3,4},{23,5},{14},{35},{66}}

查询条件以长度为2的一维数组表示,上图查询坐标为(1,1)时表示为

{1,1}

使用Java标准IO键盘输入进行录入时,先录入节点数量,然后逐行录入节点。最后录入查询的位置,对于上述示例为:

6

10 1 2

-21 3 4

23 5

14

35

66

1 1

输出

{23}

举例:上图中,假定圆圈内的数字表示节点保存的内容值,则根据坐标(1,1)查到的内容值是23。

输出描述:

查询到内容时,输出{内容值},查询不到时输出{}

上图中根据坐标(1,1)查询输出{23},根据坐标(1,2)查询输出{}

示例1 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

6

10 1 2

-21 3 4

23 5

14

35

66

1 1

输出

{23}

import java.util.Scanner;

public class Main {
    static int[][] tree;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        tree = new int[n][n];
        for (int i = 0; i < n; i++) {
            tree[i][0] = sc.nextInt(); // 节点值
            for (int j = 1; j <= n; j++) {
                tree[i][j] = sc.nextInt(); // 子节点在数组中的索引位置
            }
        }
        int[] pos = new int[2];
        pos[0] = sc.nextInt();
        pos[1] = sc.nextInt();
        int res = dfs(0, pos[0], pos[1]);
        if (res != -1) {
            System.out.println("{" + tree[res][0] + "}");
        } else {
            System.out.println("{}");
        }
    }

    public static int dfs(int cur, int x, int y) {
        if (x == 0) {
            return cur;
        }
        int[] child = tree[cur];
        for (int i = 1; i < child.length; i++) {
            if (child[i] != 0) { // 存在子节点
                int w = width(child[i - 1]);
                if (y <= w) {
                    return dfs(child[i - 1], x - 1, y);
                } else {
                    y = y - w;
                }
            } else {
                break;
            }
        }
        return -1;
    }

    public static int width(int pos) { // 计算宽度
        int w = 0;
        while (pos != 0) {
            pos = tree[pos][1];
            w++;
        }
        return w;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值