找数字 华为OD真题 100


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 k=0; k<listInts.size(); k++){
                    int[] intnum = listInts.get(k);
                    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);
 
    }
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值