全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。
真题库:https://www.yuque.com/codernav.com/od
题目:找数字
知识点:哈希表
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
给一个二维数组nums,对于每一个元素num[i],找出距离最近的且值相等的元素,输出横纵坐标差值的绝对值之和,如果没有等值元素,则输出-1。
例如:
输入数组nums为
0 3 5 4 2
2 5 7 8 3
2 5 4 2 4
对于 num[0][0] = 0,不存在相等的值。
对于 num[0][1] = 3,存在一个相等的值,最近的坐标为num[1][4],最小距离为4。
对于 num[0][2] = 5,存在两个相等的值,最近的坐标为num[1][1],故最小距离为2。
…
对于 num[1][1] = 5,存在两个相等的值,最近的坐标为num[2][1],故最小距离为1。
…
故输出为
-1 4 2 3 3
1 1 -1 -1 4
1 1 2 3 2
输入描述:
输入第一行为二维数组的行
输入第二行为二维数组的列
输入的数字以空格隔开。
输出描述:
数组形式返回所有坐标值。
补充说明:
针对数组num[i][j],满足0<i<=100;0<j<=100。
对于每个数字,最多存在100个与其相等的数字。
示例1
输入:
3
5
0 3 5 4 2
2 5 7 8 3
2 5 4 2 4
输出:
[[-1, 4, 2, 3, 3], [1, 1, -1, -1, 4], [1, 1, 2, 3, 2]]
解题思路:
将二维数组中的值和坐标转化为map对象。
遍历二维数组中的值,找出其值的所有坐标,求出其中距离最短的值
代码实现一:
package com.codernav.demo.hwod.exam;
import java.util.*;
/**
* @title 找数字
* @Description 给一个二维数组nums,对于每一个元素num[i],找出距离最近的且值相等的元素,输出横纵坐标差值的绝对值之和,如果没有等值元素,则输出-1。
* @Author 开发者导航
* @website https://codernav.com
* @date 2023/5/13
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] nums = new int[n][m];
/**
* 将数字和坐标转化为map
* key:nums数组中的各值
* value:nums数组中的坐标的集合
*/
Map<Integer, List<int[]>> map = new HashMap<>();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int input = sc.nextInt();
nums[i][j] = input;
int[] ints1 = new int[]{i, j}; //将坐标转化为数组
List<int[]> tempList;
if (map.containsKey(input)) {
tempList = map.get(input);
} else {
tempList = new ArrayList<>();
}
tempList.add(ints1);
map.put(input, tempList);
}
}
List<List<Integer>> resList = new ArrayList<>();
for (int i = 0; i < n; i++) {
List<Integer> list = new ArrayList<>();
for (int j = 0; j < m; j++) {
int num = nums[i][j];
List<int[]> listInts = map.get(num);
if (listInts.size() == 1) { //只有一个坐标,则不存在相等的值
list.add(-1);
continue;
}
int min = Integer.MAX_VALUE; //最小距离
for (int[] intnum : listInts) {
int distance = Math.abs(intnum[0] - i) + Math.abs(intnum[1] - j); //求出距离
if (distance == 0) { //距离为0则跳过
continue;
}
min = Math.min(min, distance);
}
list.add(min);
}
resList.add(list);
}
System.out.println(resList);
}
}
代码实现二:
package com.codernav.demo.hwod.exam;
import java.util.Arrays;
import java.util.Scanner;
/**
* @title 找数字
* @Description 给一个二维数组nums,对于每一个元素num[i],找出距离最近的且值相等的元素,输出横纵坐标差值的绝对值之和,如果没有等值元素,则输出-1。
* @Author 开发者导航
* @website https://codernav.com
* @date 2023/5/13
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
int[][] map = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
map[i][j] = in.nextInt();
}
}
int[][] ans = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
ans[i][j] = find(map, i, j);
}
}
System.out.println(Arrays.deepToString(ans));
}
private static int find(int[][] map, int i, int j) {
int target = map[i][j];
int ans = Integer.MAX_VALUE;
for (int k = 0; k < map.length; k++) {
for (int l = 0; l < map[0].length; l++) {
if (k == i && l == j) {
continue;
}
if (map[k][l] == target) {
ans = Math.min(ans, Math.abs(i - k) + Math.abs(j - l));
}
}
}
return ans == Integer.MAX_VALUE ? -1 : ans;
}
}
