我觉得这个挑战很有趣,所以我试了一下。我是用 Java 编写的,但它可以很容易地转换成你想要的任何语言。
int[][] arr = { { 3, 3, 4, 2 }, { 4, 4 }, { 4, 0, 3, 5 }, { 3, 3 } };
Map<Integer, List<Integer>> map = new TreeMap<>();
for (int i = 0; i < arr.length; i++) {
int mean = mean(arr[i]);
if (map.containsKey(mean)) {
List<Integer> l = map.get(mean);
l.add(i);
map.put(mean, l);
} else {
List<Integer> l = new ArrayList<>();
l.add(i);
map.put(mean, l);
}
}
选择 TreeMap,因为它使键保持升序(排序)。这个 Map 将手段作为键和索引作为 List 中的值。然后我们遍历数组,找到均值,将其添加到地图中并在地图列表中索引,如果地图已经包含均值,则将索引添加到现有列表中。
int finArr[][] = new int[map.values().size()][]; //this will hold the final answer--arrays of indices.
List<Integer> keys = new ArrayList<>(map.keySet());
map.keySet() 将按升序返回键(因为我们在上面选择创建 TreeMap 类型的 Map),但我们希望立即将其转换为 ArrayList,因为我们无法使用索引从 Set 中提取值。而且我们还需要索引来将正确位置的数组输入到最终数组中。
for (int i = 0; i < keys.size(); i++) {
finArr[i] = map.remove(keys.get(i)).stream().mapToInt(val -> val).toArray();
}
在上面的 for 循环中,我们基本上是从 map 中提取值(这是一个 List),并将该 List 转换为原始 int 数组。
System.out.print("[ ");
for (int[] is : finArr) {
System.out.print(Arrays.toString(is) + " ");
}
System.out.println("]");
输出:[ [0, 2, 3], [1] ]
平均肉食:
private static int mean(int[] arr) {
int sum = 0;
for (int i : arr) {
sum += i;
}
return sum / arr.length;
}
奖金::
这种 InsertionSort 的变体可以根据平均值对数组进行排序。
for (int i = 1; i < arr.length; i++) {
int[] kk = arr[i];
int key = mean(arr[i]);
int j = i - 1;
while (j > -1 && mean(arr[j]) > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = kk;
}
for (int[] is : arr) {
System.out.println(Arrays.toString(is));
}
输出:[3,3,3,4]