如何对包含重复项的数组进行洗牌,但重复项不能背靠背
How to shuffle an array with duplicate items, but duplicates can't be back to back
给定一个数组 [1, 2, 2, 3, 4, 4, 5]
,是否可以打乱数组同时防止重复项彼此相邻?
例如:
[1, 2, 3, 4, 2, 5, 4]
是一个可以接受的解决方案。
[1, 2, 3, 4, 4, 2, 5]
不是可接受的解决方案,因为 4
紧挨着另一个 4
这道题看似简单,但仔细想想,解法似乎很复杂。非常感谢任何帮助,谢谢!!
如果你不在意算法的执行时间,只要shuffle几次,直到得到你想要的结果
let arr = [1, 2, 2, 3, 4, 4, 5];
const hasDublicateItems = (arr) => arr.some((v, i, a) => v === a[i+1]);
while (hasDublicateItems(arr))
arr = arr.sort(() => (Math.random() > .5) ? 1 : -1);
console.log(arr);
.as-console-wrapper{min-height: 100%!important; top: 0}
给定一个数组 [1, 2, 2, 3, 4, 4, 5]
,是否可以打乱数组同时防止重复项彼此相邻?
例如:
[1, 2, 3, 4, 2, 5, 4]
是一个可以接受的解决方案。[1, 2, 3, 4, 4, 2, 5]
不是可接受的解决方案,因为4
紧挨着另一个4
这道题看似简单,但仔细想想,解法似乎很复杂。非常感谢任何帮助,谢谢!!
如果你不在意算法的执行时间,只要shuffle几次,直到得到你想要的结果
let arr = [1, 2, 2, 3, 4, 4, 5];
const hasDublicateItems = (arr) => arr.some((v, i, a) => v === a[i+1]);
while (hasDublicateItems(arr))
arr = arr.sort(() => (Math.random() > .5) ? 1 : -1);
console.log(arr);
.as-console-wrapper{min-height: 100%!important; top: 0}