题目1: 请用任意语言编写如下函数,输入为长度为N的 int 型数组,输出为每个数的排名(数值最大排名为 1)注意: (1)需一定程度考虑算法效率 (2)允许直接调用内置的 sort0)函数,而不必重新编写 sort 算法例如,输入[100,-3,2,0,1],输出为[1,5,2,4,3]。
时间: 2024-02-18 21:59:38 浏览: 36
以下是Java实现的代码:
```java
import java.util.*;
public class RankArray {
public static int[] rankArray(int[] arr) {
// 使用HashMap存储每个数及其出现次数
Map<Integer, Integer> count = new HashMap<>();
for (int num : arr) {
count.put(num, count.getOrDefault(num, 0) + 1);
}
// 对不同的数进行排名
Map<Integer, Integer> rank = new HashMap<>();
int r = 1;
for (int num : new TreeSet<>(count.keySet()).descendingSet()) {
rank.put(num, r);
r += count.get(num);
}
// 返回每个数的排名
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = rank.get(arr[i]);
}
return res;
}
public static void main(String[] args) {
int[] arr = {100, -3, 2, 0, 1};
int[] res = rankArray(arr);
System.out.println(Arrays.toString(res));
}
}
```
该函数使用HashMap存储每个数及其出现次数,并使用TreeSet对不同的数进行排序。然后使用HashMap存储每个数的排名,其中r表示当前排名,每次加上相同数的个数,以便正确计算下一个数的排名。最后返回每个数的排名。算法效率为$O(nlogn)$,其中n为数组长度,主要由TreeSet的排序算法决定。