华为OD机试-找数字、找等值元素
【找数字】
给一个二维数组nums,对于每一个元素num[i],找出距离最近的且值相等的元素,输出横纵坐标差值的绝对值之和,如果没有等值元素,则输出 -1。
输入描述
输入第一行为二维数组的行
输入第二行为二维数组的列
输入的数字以空格隔开。
输出描述
数组形式返回所有坐标值。
------------------------------------------------------------------------------
示例一:
输入:
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
import java.util.*;
/**
* 主要思路:
* 1.先遍历将相同数字的坐标放在一块
* 2,再次遍历,求出最小坐标和
*/
public class OdAb27 {
public static void main(String[] args) {
// 读取输入
Scanner scanner = new Scanner(System.in);
int rows = scanner.nextInt(); // 行数
int cols = scanner.nextInt(); // 列数
Map<Integer, List<int[]>> d = new HashMap<>(); // 用于存储元素及其坐标
int[][] l = new int[rows][cols]; // 存储结果
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
int num = scanner.nextInt();
l[i][j] = num;
if (!d.containsKey(num)) { // 如果字典中没有该元素
d.put(num, new ArrayList<int[]>()); // 添加元素及其坐标
}
d.get(num).add(new int[]{i, j});
}
}
System.out.println(d); // 输出字典
// 遍历二维数组,对于每个元素找到距离最近的相等元素
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
int k = l[i][j];
int mds = Integer.MAX_VALUE; // 最小距离初始化为正无穷
if (d.get(k).size() == 1) { // 如果该元素只出现了一次
l[i][j] = -1; // 直接赋值为 -1
} else { // 如果该元素出现了多次
for (int[] coord : d.get(k)) {
if (i != coord[0] || j != coord[1]) { // 不是元素本身
int ds = Math.abs(coord[0] - i) + Math.abs(coord[1] - j); // 计算距离
mds = Math.min(mds, ds); // 更新最小距离
}
}
l[i][j] = (mds == Integer.MAX_VALUE ? -1 : mds); // 更新结果
}
}
}
// 输出结果
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
System.out.print(l[i][j] + " ");
}
System.out.println();
}
}
}