构造辅助数组,该数组将包含该值及其原始索引 - O(n)
。
[[0, 'abb'], [1, 'ada'], [2, 'bba'], [3, 'bba'], [4, 'dab'], [5, 'bad']] // Stored as 'foo' in the following examples
使用比较器函数对新创建的数组进行排序- 根据您的假设O(n)
(但我对此表示怀疑)。
foo.sort(function (a, b) { return a[1].localeCompare(b[1]); });
遍历已排序的数组并在途中创建您的排名数组 - O(n)
。
var last = null, rank = 0, result = [], i;
for (i = 0; i < foo.length; i++) {
result[foo[i][0]] = (last === null || last.localeCompare(foo[i][1]) != 0) ? ++rank : rank;
last = foo[i][1];
}
享受您的result
.
更新另一种方法是通过带有索引的关联数组:
{ 'abb': [0], 'ada': [1], 'bba': [2, 3], 'dab': [4], 'bad': [5] }
然后您可以创建键数组(因此是唯一值),对其进行排序并基于此构建您的排名。