java - 数组的排名值
问题描述
我有这个数组输入:int[] input = {1,3,2,2,33,1};
我需要像这个输出一样为它打分:{1,3,2,2,4,1}
所以最小的数字得到1,如果有更小的数字,它得到2,依此类推。另一个例子:对于输入-输出{1,10,3,44,5,2,5}
->{1,5,3,6,4,2,4}
这是我的尝试,但它没有按预期工作。
public static int[] getRanksArray(int[] array) {
int[] result = new int[array.length];
for (int i = 0; i < array.length; i++) {
int count = 0;
for (int j = 0; j < array.length; j++) {
if (array[j] != array[i]) {
count++;
}
}
result[i] = count + 1;
}
return result;
}
解决方案
编辑:更新为处理 double 而不是 int 输入数组。
首先对表示输入数组索引的数组进行排序。然后遍历这个数组,每当你遇到不相等的连续元素时增加一个排名计数器(ideone)
public static int[] rank(double[] nums)
{
Integer[] idx = new Integer[nums.length];
for(int i=0; i<idx.length; i++) idx[i] = i;
Arrays.sort(idx, (a, b) -> (Double.compare(nums[a], nums[b])));
// Or use this for descending rank
// Arrays.sort(idx, (a, b) -> (Double.compare(nums[b], nums[a])));
int[] rank = new int[nums.length];
for(int i=0, j=1; i<idx.length; i++)
{
rank[idx[i]] = j;
if(i < idx.length - 1 && nums[idx[i]] != nums[idx[i+1]]) j++;
}
return rank;
}
测试:
System.out.println(Arrays.toString(rank(new double[] {1,3,2,2,33,1})));
System.out.println(Arrays.toString(rank(new double[] {1,10,3,44,5,2,5})));
输出:
[1, 3, 2, 2, 4, 1]
[1, 5, 3, 6, 4, 2, 4]
推荐阅读
- javascript - 创建一个 d3 风格的链式函数
- here-api - 在 Here API V3 和 V8 中使用名称搜索电台的不同响应
- android - Android:如何存储来自相机的图像并显示图库?
- node.js - Firebase 实时数据库查询:根据登录的 UserId 和数据库中的另一个唯一标识符过滤数据
- ios - 将集合视图高度与单元格高度匹配
- conda - 将 requirements.txt 转换为 Conda 环境文件的策略
- r - 日期和时间
- python - 为 discord.py 添加冷却时间
- reactjs - 仅获取特定 Tailwind CSS 类的 CSS 值
- javascript - 木偶的问题