JS实现不重复的条形码

 在一个仓库里,有一排条形码,其中第 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

知识点:
MethodDescription
new Map()创建新的 Map 对象。
set()为 Map 对象中的键设置值。
get()获取 Map 对象中键的值。
entries()返回 Map 对象中键/值对的数组。
keys()返回 Map 对象中键的数组。
values()返回 Map 对象中值的数组。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

suoh's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值