一、题目描述
给一个二维数组nums,对于每一个元素nums[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个与其相等的数字;
五、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 实现【货币单位换算】【2023Q1 100分】
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。
在这里插入代码片