在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。
请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。
示例 1:
输入:barcodes = [1,1,1,2,2,2]
输出:[2,1,2,1,2,1]
示例 2:
输入:barcodes = [1,1,1,1,2,2,3,3]
输出:[1,3,1,3,2,1,2,1]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>距离相等的条形码</title>
</head>
<body>
<script>
/**
* @param {number[]} barcodes
* @return {number[]}
*/
/**
*
* 在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。
* 请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。
示例 1:
输入:barcodes = [1,1,1,2,2,2]
输出:[2,1,2,1,2,1]
示例 2:
输入:barcodes = [1,1,1,1,2,2,3,3]
输出:[1,3,1,3,2,1,2,1]
*/
// 思想:拿到所有值的集合,在空数组里面进行奇偶位置填充
var rearrangeBarcodes = function (barcodes) {
let m = new Map()
// 计算数组中不重复数字的个数
for (let i of barcodes) {
// 不存在则将对应的数字作为键值存入,并初始化为0
if (!m.has(i)) m.set(i, 0)
// 获取每个数字并存入,对应的value加1
m.set(i, m.get(i) + 1)
}
let a = Array.from(m.entries())
// 按次数从大到小排列
a.sort((a, b) => b[1] - a[1])
let c = 0;
for (let [k, v] of a) {
while (v > 0 && c < barcodes.length) {
barcodes[c] = k; //先填充偶数位
v -= 1; //填充一个次数减一
c += 2; //相应的位置加2,这样可以保证相邻的数字不同
if (c >= barcodes.length) c = 1; // 再填充奇数位
}
}
return barcodes;
};
console.log(rearrangeBarcodes([4, 4, 4, 1, 1, 1, 1, 2, 2, 3, 3]))
</script>
</body>
</html>l
知识点:
Method Description new Map() 创建新的 Map 对象。 set() 为 Map 对象中的键设置值。 get() 获取 Map 对象中键的值。 entries() 返回 Map 对象中键/值对的数组。 keys() 返回 Map 对象中键的数组。 values() 返回 Map 对象中值的数组。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/149641.html