题意为从一个正序数组中,将其中的整数按照出现的频次多少来排列(并且出现几次就排列几个),比如输入为[1,1,1,2,2,2,2,3,3,4,4,4,4,4,4,5,5,5],那么输出就应该为[ 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 1, 1, 1, 5, 5, 5, 3, 3 ],其中,如果某两个数字的出现频次相同,那么就按照输入用例中的原顺序排列。
测试矩阵 arr=[1,1,1,2,2,2,2,3,3,4,4,4,4,4,4,5,5,5]
function sortByCount (arr) {
var arrUni= [...new Set(arr)];
var countArr=[];
var flag = 0;
arrUni.forEach((val)=>{
let count = arr.lastIndexOf(val) - arr.indexOf(val)+1
countArr.push(count)
})
//最关键的一步,利用计数数组顺序去排列去重后的arr
sort(arrUni, countArr)
function sort(a,b){
function swap (arr, x, y) {
let temp = arr[x];
arr[x] = arr[y];
arr[y] = temp
return arr
}
for (let i = 0; i < b.length - 1; i++) {
for (let j = i; j < b.length; j++) {
if (b[i] < b[j]) {
swap(b, i, j)
swap(a, i, j)
}
}
}
}
//方法二,利用内置函数sort自定义排序,不易理解
// let arrTmp = arrUni.slice();
// arrUni.sort((x,y)=>{
// let idx=arrTmp.indexOf(x)
// let idy=arrTmp.indexOf(y)
// return countArr[idy]-countArr[idx]
// })
// countArr.sort((x,y)=>y-x)
for(let i=0;i<countArr.length;i++){
for(let j=0;j<countArr[i];j++){
arr[flag] =arrUni[i]
flag++
}
}
return arr
}