持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情。
题目描述
给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。
序号代表了一个元素有多大。序号编号的规则如下:
序号从 1 开始编号。
一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。
每个数字的序号都应该尽可能地小
来源:力扣(LeetCode)
- 示例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
思路分析
本题会给出一个整数数组arr,需要将数组中的每个元素替换成它们排序后的序号,序号必须是从1开始编号。为了能得到这些元素的序号,我们必须先将它们排序并去重,如果不去重,将会出现同一个元素不同序号的结果;并且,这个排序呢,还是必须以正序排序的;
首先,利用Set()和数组方法Array.from()复制一个新的数组(已经去重了的),再将这个数组进行排序,这样就可以正确的拿到从小排到大的序号了。循环原数组,因为序号的数组的组成顺序是以原数组的顺序排的。在这个循环体里面再进行一个循环,循环已经排好序的新数组,当判断到外层的某个元素和内层循环的某个元素相同时,就可以将内层循环到的下标加一push到序号数组中,当循环结束,这个循环数组就是我们的目的数组。
AC代码
let arr = [40,10,20,20,30];
function solution(arr) {
let newArr = Array.from(new Set(arr));
let sortArr = newArr.sort((a, b) => { return a - b});
let indexArr = [];
for(let i=0; i<arr.length; i++) {
for(let j=0; j<sortArr.length; j++) {
if(arr[i] == sortArr[j]) {
indexArr.push(j+1);
}
}
}
console.log(indexArr);
}
solution(arr);