给你一个整数数组
arr
,请你将数组中的每个元素替换为它们排序后的序号。序号代表了一个元素有多大。序号编号的规则如下:
- 序号从 1 开始编号。
- 一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。
- 每个数字的序号都应该尽可能地小。
示例 1:
输入:arr = [40,10,20,30] 输出:[4,1,2,3] 解释:40 是最大的元素。 10 是最小的元素。 20 是第二小的数字。 30 是第三小的数字。示例 2:
输入:arr = [100,100,100] 输出:[1,1,1] 解释:所有元素有相同的序号。示例 3:
输入:arr = [37,12,28,9,100,56,80,5,12] 输出:[5,3,4,2,8,6,7,1,3]提示:
0 <= arr.length <= 105
-109 <= arr[i] <= 109
/**
* @param {number[]} arr
* @return {number[]}
*/
var arrayRankTransform = function(arr) {
// 三点运算符是用来,展开数组
let s = [...new Set(arr)];
// sort用来,对数组中相邻的两个数进行比较
s = s.sort((a, b) => a - b);
// Map是以[键,值]存储
let map = new Map();
// set方法设置key所对应的键值,然后返回整个Map结构。如果key已经有值,则键值会被更新,否则就新生成该键。
for (let i = 0; i < s.length; i++) {
map.set(s[i], i+1);
}
// get方法读取key对应的键值,如果找不到key,返回undefined。
for (let i = 0; i < arr.length; i++) {
arr[i] = map.get(arr[i])
}
return arr;
};
// 整体的思路:
// 先将arr 用三点运算符,展开放到数组s,然后对s里面的邻的两个数进行比较
// 接着,在new一个map对象,一方面它可以去重,第二方面可以遍历的使用map.set;map.get