算法题记录【华为od】整理扑克牌

题目描述

 

 思路分析

        又是一个优先级的问题,所以先按最大的组合牌大小分,之后再依次排序,去重那里用map函数的特性;

代码解析

let input = "7 7 6 6 6 7 7 3 3 3 5 5 2 2 6 6 4 4 4 8 8 9 9 9 9 9 9 9 9 9"
let input1 = input.split(" ");
console.log('input1=>', input1);
let map = [], res = [], a = [], b = [], c = [], d = [], result = [];
for (let i = 0; i < input1.length; i++) {
  if (map.indexOf(input1[i]) == -1) {
    map.push(input1[i])
    res.push({
      val: input1[i],
      count: 1
    })
  } else {
    res.map(item => {
      if (item.val == input1[i]) item.count++
    })
  }
}
//判断炸弹
res.sort((a, b) => {
  return parseInt(b.val) - parseInt(a.val)
}).map((item) => {
  while (item.count >= 4) {
    let mid = []
    for (let i = 0; i < 4; i++) {
      mid.push(item.val)
    }
    a.push(mid)
    item.count -= 4
  }
})
//炸弹按照数值大小进行判断
a.sort((a, b) => parseInt(b[0]) - parseInt(a[0]))
//判断葫芦 因为已经判断过4张重复牌组,所以数组中最大的重复牌组只有三张
res.map((item) => {
  while (item.count >= 3) {
    let mid = []
    for (let i = 0; i < 3; i++) {
      mid.push(item.val)
    }
    b.push(mid)
    item.count -= 3
  }
})
res.map((item) => {
  while (item.count >= 2) {
    let mid = []
    for (let i = 0; i < 2; i++) {
      mid.push(item.val)
    }
    c.push(mid)
    item.count -= 2
  }
})
const lenDouble = c.length;
const lenTir = b.length;
for (let i = 0; i < Math.min(lenDouble, lenTir); i++) {
  d.push([
    ...b[0],
    ...c[0]
  ])
  b.shift();
  c.shift();
}
//将最终数组进行组合
if (a.length != []) result.push(...a)
if (d.length != []) result.push(...d)
if (c.length != []) result.push(...c)
if (b.length != []) result.push(...b)
res.map(item => {
  if (item.count > 0) result.push([item.val])
})
console.log('result=>', result);

后话

只是记录,正在找工作中,各位老板缺前端的可以私信,会vue,react,ts,js,22届本科毕业,一年工作经验

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值