java—mxn矩阵中心的索引如果中心不存在,则返回最接近中心的平方的索引,其中包含最高整数

7eumitmz  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(297)

尝试编写一个返回mxn矩阵中心的方法,如果该中心不存在,则该方法应返回最接近中心且具有最高整数值的平方的索引
例1-

[[5, 7, 8, 6, 3],
 [0, 0, 7, 0, 4],
 [4, 6, 3, 4, 9],
 [3, 1, 0, 5, 8]]

return[1,2](中心不存在,所以离中心最近的是[[0,7,0],[6,3,4]],7是最大值)
例2-

[[5, 7, 8, 6],
 [0, 0, 7, 0],
 [4, 6, 3, 4],
 [3, 1, 0, 5]]

return[1,2](center不存在,所以离center最近的是[[0,7],[6,3]],7是最大值)
例3-

[[5, 7, 8],
 [0, 0, 7],
 [4, 6, 3]]

return[1,1](中心存在)

private static int[] centerCoordinates(int[][] matrix) {
    int row = matrix.length;
    int col = matrix[0].length;
    if (row % 2 != 0 && col % 2 != 0 && row == col)
        return new int[]{row / 2, col / 2};
    if (row % 2 == 0 && col % 2 == 0 && row == col) {
        //calculate the max of internal square Eg 2.
        return new int[]{x, y};
    }
    //where row!=col
}
jvlzgdj9

jvlzgdj91#

我假设您在示例1中犯了一个错误,您给出了正确的答案,但我认为考虑的单元格应该只有[[7],[3]],而不是3列宽。
基本上如果尺寸是偶数,检查长度/2-1和长度/2。
如果尺寸为奇数,只检查长度/2。
绕过去,带上马克斯。

private static int[] centerCoordinates(int[][] matrix) {
    int row = matrix.length;
    int col = matrix[0].length;
    int[] ans = new int[]{row/2-(1-(row%2)), col/2-(1-(col%2))};
    int best = Integer.MIN_VALUE;
    for(int i=row/2-(1-(row%2));i<row/2+1;i++){
        for(int j=col/2-(1-(col%2));j<col/2+1;j++){
            if(matrix[i][j]>best){
                best = matrix[i][j];
                ans = new int[]{i,j};
            }
        }
    }
    return ans;
}
camsedfj

camsedfj2#

在这种情况下,中心点只存在于 m == n 两个都是奇数。如果不满足这个条件,那么就去中部地区 (m, n) :
偶数-从 x / 2length - x / 2 奇数-从 x / 2 - 1length - x / 2 + 1 ```
public static void main(String[] args) {
int[][] m1 = {
{5, 7, 8, 6, 3},
{0, 0, 7, 0, 4},
{4, 6, 3, 4, 9},
{3, 1, 0, 5, 8}};
int[][] m2 = {
{5, 7, 8, 6},
{0, 0, 7, 0},
{4, 6, 3, 4},
{3, 1, 0, 5}};
int[][] m3 = {
{5, 7, 8},
{0, 0, 7},
{4, 6, 3}};

int[][] cr1 = centralRegion(m1);
int[][] cr2 = centralRegion(m2);
int[][] cr3 = centralRegion(m3);

Arrays.stream(cr1).map(Arrays::toString).forEach(System.out::println);
// [0, 7, 0]
// [6, 3, 4]
System.out.println(maxValue(cr1)); // 7

Arrays.stream(cr2).map(Arrays::toString).forEach(System.out::println);
// [0, 7]
// [6, 3]
System.out.println(maxValue(cr1)); // 7

Arrays.stream(cr3).map(Arrays::toString).forEach(System.out::println);
// [3]

}

public static int[][] centralRegion(int[][] arr) {
if (arr.length == arr[0].length && arr.length % 2 != 0) {
return new int[][]{{arr[arr.length / 2 + 1][arr[0].length / 2 + 1]}};
} else {
return Arrays.stream(arr, cp(arr.length), arr.length - cp(arr.length))
.map(row -> Arrays
.stream(row, cp(row.length), row.length - cp(row.length))
.toArray())
.toArray(int[][]::new);
}
}

public static int cp(int length) {
return length / 2 - length % 2 == 0 ? 0 : 1;
}

public static int maxValue(int[][] arr) {
return Arrays.stream(arr).flatMapToInt(Arrays::stream).max().getAsInt();
}

相关问题