我正在编写一个试图找到二维数组中间的函数,这是我到目前为止所拥有的:
int findMiddle(int[][] grid,int [] m) {
int[] list = new int[grid.length*grid[0].length];
int listPos = 0;
for(int i = 0 ; i < grid.length; i++) {
for(int j = 0; j < grid.length; j++) {
list[listPos++] = grid[i][j];
}
}
int middle = m.length/2;
if (m.length%2 == 1) {
return m[middle];
} else {
return (m[middle-1] + m[middle]) / 2.0;
}
}
假设我有一个
数组{{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 0, 1}}
它应该返回6,因为它是整数除法。 此外,此代码中的中间定义是整个原始数组的中间整数(不用说它是否已排序)。
我该怎么做? (我的代码也没有编译)
答案 0 :(得分:0)
这会编译,并会给你序列中的中间数字,或者如果中间数字分成中间数字,则为中间数字:
static double findMiddle(int[][] grid) {
int[] list = new int[grid.length*grid[0].length];
int listPos = 0;
for(int i = 0 ; i < grid.length; i++) {
for(int j = 0; j < grid[i].length; j++) {
list[listPos++] = grid[i][j];
}
}
int middle = list.length/2;
if ((list.length%2) == 1) {
return list[middle];
}
return (list[middle-1] + list[middle]) / 2.0;
}
但是,在您找到中间数字之前,我怀疑您在将数字组合成单个数组后想要对数字进行排序。 (如piyush121评论)
答案 1 :(得分:0)
假设您定义了中位数&#39;是正确的(奇数长度集的中间数或偶数长度集的两个中间数的平均值),如果grid [] []被排序,并且grid [] []是正方形数组(即网格) .length = grid [i] .length为0..length-1中的所有i,然后你不需要将数据复制到另一个数组。以下就足够了:
"Volume" => defaultArg (Stats.sum temp?Volume) nan ] )
答案 2 :(得分:0)
查看现有代码,如果将所有值放入单个行列表中,您似乎将“中位数”定义为矩阵中的中间值。换句话说,您不需要处理奇数行(当同一列中的两个数字位于中间时)或奇数个行和列(当中间有四个数字时)。
如果该定义是正确的,那么您可以通过流式传输所有值然后选择中间值来应对不均匀行的所有复杂性。
为了您的兴趣,这是一个Java 8解决方案:
int[] flat = Arrays.stream(grid).flatMapToInt(Arrays::stream).toArray();
double middle = Arrays.stream(flat).skip(flat.length / 2).limit(1 + flat.length % 2)
.average().getAsDouble();