Q8:数组序号转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
输入:arr = [40,10,20,30]
输出:[4,1,2,3]
解释:40 是最大的元素。 10 是最小的元素。 20 是第二小的数字。 30 是第三小的数字。

输入:arr = [100,100,100]
输出:[1,1,1]
解释:所有元素有相同的序号。

输入:arr = [37,12,28,9,100,56,80,5,12]
输出:[5,3,4,2,8,6,7,1,3]


解答:
方法1,建立索引:
var arrayRankTransform = function(arr) {
const localArr = JSON.parse(JSON.stringify(arr))
const sortArr = arr.sort((a, b) => a - b)
let num = 0
let prev = null
const mapArr = sortArr.map(i => {
if (prev !== i) {
prev = i
num++
}
return { label: i, value: num }
})
const outArr = localArr.map(i => {
const result = mapArr.find(j => j.label === i)
return result.value
})
return outArr
};


方法2,进一步优化:
var arrayRankTransform = function(arr) {
const nums = [...new Set(arr)].sort((a, b) => a - b) // 去重后排序
const mp = new Map() // 映射
for (let i = 0; i < nums.length; i ++ )
mp.set(nums[i], i)

return arr.map(item => mp.get(item) + 1)
};