题目描述
思路分析
又是一个优先级的问题,所以先按最大的组合牌大小分,之后再依次排序,去重那里用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届本科毕业,一年工作经验