首页 > 解决方案 > 数组的排名值

问题描述

我有这个数组输入: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;
}

标签: javaarraysalgorithm

解决方案


编辑:更新为处理 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]

推荐阅读