【问题标题】:Replacing a number in a 2D array in java?在java中替换二维数组中的数字?
【发布时间】:2021-04-29 15:04:00
【问题描述】:

我有一个函数可以找到第一个最小值并从二维数组中返回:

public static int getMinimumValueOfTerrain(int[][] terrain) {
    int min = Integer.MAX_VALUE;
    for (int row = 0; row < terrain.length; row++) {
        for (int col = 0; col < terrain[row].length; col++) {
            min = Math.min(min, terrain[row][col]);
        }
    }
    return min;
}

我有另一个函数应该用它的负值替换找到的最小值:

public static int[][] replaceMinusValue(int[][] terrain) {
    for (int row = 0; row < terrain.length; row++) {
        for (int col = 0; col < terrain[row].length; col++) {
            int tempValue = getMinimumValueOfTerrain(terrain);
            int minusValue = -tempValue;
        }
    }
    return terrain;
}

例子:

2 1 3
3 2 1
4 2 5

预期结果:

2 -1 3
3 2 1
4 2 5

如何使用我的函数来处理它?

【问题讨论】:

  • 你想替换元素还是从第二个函数返回新数组?
  • 我想从第二个函数中返回它

标签: java arrays matrix multidimensional-array


【解决方案1】:

您还应该将min 的行和列索引保留在getMinimumValueOfTerrain 中。在for 循环之后,您可以将terrain[minRow][minColumn] 更改为负数。如果没有约束,我认为只有getMinimumValueOfTerrain 方法就足够了。如果有,您可以编写另一个返回 2 元素索引数组的函数。

【讨论】:

    【解决方案2】:

    您有多种选择。如果你只这样做一次或者效率无关紧要,你可以遍历整个数组并找到最小的元素,然后替换该元素。例如:

    public static void replaceMinusValue(int[][] terrain) {
        int min = Integer.MAX_VALUE;
        int minI = -1;
        int minJ = -1;
        for (int i = 0; i < terrain.length; i++) {
            for (int j = 0; j < terrain[i].length; j++) {
                if (terrain[i][j] < min) {
                    min = terrain[i][j];
                    minI = i;
                    minJ = j;
                }
            }
        }
    
        terrain[minI][minJ] *= -1;
    }
    

    会那样做。请注意,翻转后不需要返回地形(就像排序时不需要返回新数组一样)。

    【讨论】:

    • 如果使用非严格条件&lt;= min,则last最小值将被替换。
    • 嗨!我还没有检查过,但我猜这个解决方案用它的负值替换了所有的最小值,对吧?
    • @HuserB1989 只有在存在多个相同值的实例时才会替换一个。但是,稍作修改就可以替换所有这些。
    【解决方案3】:

    更快的实现是检测最小值的行和列坐标并修改该值:

    public static int[][] findAndReplaceMinValue(int[][] terrain) {
        int min = Integer.MAX_VALUE;
        int minRow = -1, minCol = -1;
    
        for (int row = 0; row < terrain.length; row++) {
            for (int col = 0; col < terrain[row].length; col++) {
                if (terrain[row][col] < min) {
                    min = terrain[row][col];
                    minRow = row;
                    minCole = col;
                }     
            }
        }
        if (minRow != -1 && minCol != -1) {
            terrain[minRow][minCol] *= -1;
        }
        return terrain;
    }
    

    如果必须在getMinimumValueOfTerrain 中重用现有方法getMinimumValueOfTerrain,则应再次重新找到min 元素,并且可以应用嵌套循环之外的break

    public static int[][] replaceMinusValue(int[][] terrain) {
        int min = getMinimumValueOfTerrain(terrain);
    
        out: 
        for (int row = 0; row < terrain.length; row++) {
            for (int col = 0; col < terrain[row].length; col++) {
                if (min == terrain[row][col]) {
                    terrain[row][col] *= -1; // or -min
                    break out;
                }    
            }
        }
        return terrain;
    }
    

    【讨论】:

    • 嗨,亚历克斯!这就是我试图接近的。因为我想使用第二个函数返回一个新数组。现在我也明白其中的逻辑了。
    猜你喜欢
    • 2021-08-31
    • 2017-06-09
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多