华为OD机试真题 Java 实现【找数字】【2023Q2 100分】-LMLPHP

一、题目描述

给一个二维数组nums,对于每一个元素nums[i],找出距离最近的且值相等的元素,输出横纵坐标差值的绝对值之和,如果没有等值元素,则输出-1。

例如

输入数组nums为

0 3 5 4 2
2 5 7 8 3
2 5 4 2 4

  1. 对于 num[0][0]= 0,不存在相等的值;
  2. 对于 num[0][1] = 3,存在一个相等的值,最近的坐标为num[1][4],最小距离为4;
  3. 对于 num[0][2]= 5,存在两个相等的值,最近的坐标为num[1][1],故最小距离为2;
  4. 对于num[1][1]= 5,存在两个相等的值,最近的坐标为num[2][1],故最小距离为1;

输出

-1 4 2 3 3
1 1 -1 -1 4
1 1 2 3 2

二、输入描述

  1. 输入第一行为二维数组的行
  2. 输入第二行为二维数组的列
  3. 输入的数字以空格隔开

三、输出描述

数组形式返回所有坐标值。

四、补充说明

  1. 针对数组num[i][j],满足0<i<=100;0<j<=100;
  2. 对于每个数字,最多存在100个与其相等的数字;

五、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int m = sc.nextInt();
    int[][] doubleArr = new int[n][m];

    // 将数组放入二维数组中
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            doubleArr[i][j] = sc.nextInt();
        }
    }
    System.out.println(get(doubleArr, n, m));
}

public static String get(int[][] doubleArr, int n, int m) {

    // 统计输入矩阵中,相同数字的位置
    Map<Integer, ArrayList<Integer[]>> map = new HashMap<Integer, ArrayList<Integer[]>>();
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            Integer num = doubleArr[i][j];
            Integer[] arr = {i, j};
            map.putIfAbsent(num, new ArrayList<>());
            map.get(num).add(arr);
        }
    }

    // 遍历矩阵每一个元素,和其他相同数字的位置求距离,取最小距离
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int num = doubleArr[i][j];
            int min = Integer.MAX_VALUE;
            for (Integer[] arr : map.get(num)) {
                int a = arr[0];
                int b = arr[1];
                // 求最小距离
                if (a != i || b != j) {
                    int temp = Math.abs(a - i) + Math.abs(b - j);
                    min = Math.min(min, temp);
                }
            }
            doubleArr[i][j] = min == Integer.MAX_VALUE ? -1 : min;
        }
    }
    return Arrays.toString(Arrays.stream(doubleArr).map(Arrays::toString).toArray(String[]::new));
}

六、效果展示

1、输入

3
4
0 1 2 3
2 3 4 5
5 3 2 1

2、输出

[[-1, 4, 2, 3], [3, 1, -1, 4], [4, 1, 2, 4]]

3、说明

只有1个0,输出-1;
有两个1,距离4;
有三个2,距离一个3,一个2,取最小的值,所以为2;
有三个3,距离一个3,一个4,取最小的值,所以为3;

以此类推。

华为OD机试真题 Java 实现【找数字】【2023Q2 100分】-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【货币单位换算】【2023Q1 100分】

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

华为OD机试真题 Java 实现【找数字】【2023Q2 100分】-LMLPHP在这里插入代码片

05-18 06:28